这是我参与「第四届青训营 」笔记创作活动的第3天
基础组件
1. Activity界面容器
- 作用
- 前台交互
- 程序入口
- 布局容器
- 基本用法
- 注册->布局->绑定
- 常用函数
- onCreate():创建时回调,一般在此处创建视图和绑定数据
- onStart():已启动,即将进入前台(在onCeate()后使用,使应用在前台显示)
- onResume():与用户开始交互,位于Activity栈顶
- onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
- onStop():Activity不再可见,下一个回调是onRestart()或onDestroy()
- onRestart():重启已停止的Activity,下一个回调是onStart()
- onDestroy():销毁Activity,释放该Activity的所有资源
- onSaveInstanceState():在非正常关闭回调,用于保存数据,不支持持久化数据
- onRestoreInstanceState / onCreate():用于数据恢复
- Activity生命周期
- 启动退出场景
- 启动:onCreate()-onStart()-onResume()
- 退出:onPause()-onStop()-onDestroy() -
- 部分遮挡
- 遮挡:onPause()
- 恢复:onResume()
- 完全遮挡
- 遮挡:onPause()-onSaveInstanceState()-onStop()
- 恢复:onState-onResume()
- 配置变更
- 未配置:
- 销毁:Resumed-onSaveInstanceState()-onPause()-onStop()-onDestroy()
- 重建:onCreate()-onStart()-onRestoreInstanceState()-onResume()
- 已配置:AndroidMainfest中配置Activity节点的configChange属性(local:语言改变;fontScale:字体大小改变;orientation:旋转屏幕;keybordHidden:键盘显示与隐藏)
- onConfigurationChanged()
- 未配置:
- 后台回收
- 销毁:不会有时机处理
- 重建:onCreate()-onStart()-onRestoreInstanceState()
- 流程图
- 启动退出场景
- 启动模式
- Standard:默认模式,允许Activity重复
- SingleTop:栈顶复用,不允许Activity连续重复
- SingleTask:栈内复用,不允许栈内Activity重复
- SingleInstance:全局复用,系统全局不允许Activity重复
2. Fragment轻量级界面容器
-
作用
- 解决屏幕尺寸碎片化问题
- 轻量级页面容器
-
基本用法
- 创建Fragment布局文件
- 创建Fragment子类,加载布局文件
- Activity加载Fragment
- 静态加载:布局中绑定
- 动态加载:FragmentManager加载
-
常用函数
- onAttach():Fragment和Activity建立关联时调用
- onCreateView():当Fragment创建视图时调用
- onActivityCreated:当Activity的onCreate()方法已返回时调用
- onDestroyView():当Fragment中的视图移除时调用
- onDetach():Fragment和Activity取消关联时调用
-
Fragment生命周期
- 启动:onAttach()-onCreate()-onCreateView()-onStart()-onResume()-Resumed
- 退出:Resumed-onPause()-onStop()-onDestroyView()-onDestroy()-onDetach()
- 部分覆盖:Resumed-onPause()-Paused
- 部分遮挡恢复:Paused-onResume()-Resumed
- 完全覆盖:Resumed-onPause()-onStop()-onDestroyView()
- 完全遮挡恢复:onCreateView()-onActivityCreated()-onStart()-onResume()-Resumed
- (Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预)
- 流程图
.findViewById(R.id.xxx)
- Activity获取Fragment中的组件:getFragmentManager.findFragmentById(R.id.fragment_xxx)
- 数据传递
- Activity传递数据给Fragment:setArguments(Bundle bundle)
- Fragment传递数据给Activity:
- 通过对象直接传递(方法调用/接口调用)
- 通过viewmodel/handler/broadcast/eventbus等通信
- 组件获取
3. Service后台服务
- 基本用法
- 注册:AndroidMainfest中使用<service.../>标签
- 创建:建立相应的Sercive实现类
- 加载:startService()/bindService()
- Service与Activity通信
- 定义Binder子类,并实现getService()方法,返回Service对象
- 实现Service类onBinder()方法,返回上述Binder()对象
- 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实力
- Activity中调用binderService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
- Activity既可以通过调用Service实例中的方法进行直接通信
- Service生命周期
- 流程图
4. Broadcast广播组件
- 基本用法
- 静态广播
- 注册:AndroidMainfest中使用<receiver.../><intent-filter.../>
- 创建:建立相应的BroadcastReceive实现类
- 接受:在步骤2类onReceive()中接受广播
- 发送:Context.sendBroadcast()
- 动态广播
- 注册:Context.registerReceiver()
- 静态广播
- 常用系统广播
- Intent.ACTION_CONNECTTIVITY_CHANGE(网络变化)
- Intent.ACTION_BATTERY_CHANGED(电源电量变化)
- Intent.ACTION_SCREEN_ON(亮屏)
- Intent.ACTION_SCREEN_OFF(熄屏)
- Intent.ACTION_INSTALL_PACKAGE(应用启动)
- Intent.ACTION_BOOT_COMPLETED(开机广播)
- Intent.ACTION_PACKAGE_ADDED(应用安装)
- Intent.ACTION_PACKAGE_REPLACED(应用覆盖)
- Intent.ACTION_PACKAGE_REMOVED(应用卸载)
5. ContentProvider数据组件
- 基本用法
- 生产者
- 注册:AndroidMainfest中使用<provider.../>
- 属性:authorities/exported/readPermission/writePermission
- 创建:建立相应的ContentProvider实现类
- 方法:onCreate/getType/insert/delete/update/query
- 消费者
- 声明:AndroidMainfest中声明权限
- 使用:context.getContentResolver()
- 方法:insert/delete/update/query
- 生产者
6. Intent意图组件
- 基本用法
- 显示Intent
- setComponent/setClass指定具体类
- 隐式Intent
- Action(动作)
- Data(数据)
- Category(类别)
- Type(数据类型)
- Component(组件)
- Extra(扩展信息)
- Flag(标志位)
- 显示Intent
- 系统能力
- 电话:
Intent(Intent.ACTION_DIAL,Rri.parse("tel:10086")) - 短信:
Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:10086")) - 网页:
Intent(Intent.ACTION_VIEW,Uri.parse("https://wwwbaidu.com")) - 邮件:
Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:someone@domain.com")) - 地图:
Intent(Intent.ACTION_VIEW,Uri.parse("geo:39.9,116.3"))(经纬度) - 拍照:
Intent(MediaStore.ACTION_IMAGE_CAPTURE) - 设置:
Intent(android.provider.Settings.ACTION_SETTINGS) - 市场:
Intent(Intent.ACTION_VIEW,Uriparse("market://details?id="+packageName))
- 使用:startActivity(Intent)
- 电话:
通信组件
1. Handler线程通信
- 基本用法
- 创建:新建Handler,实现handleMessage(Message)
- 构造Message:what/setData()
- 发送:子现象调用Handler.sendMessage(Message)发送Message
- 处理:在Handler的handleMessage(Message msg)主线程更新UI
2. Binder进程通信
- 基本用法
- 服务端
- 定义一个AIDL文件
- 实现描述的接口,编写service
- 如果有实体类,需要提供实体类(jar包形式)
- 客户端
- 拿到AIDL文件
- 绑定服务。获得接口持有对象
- 服务端
- APP启动流程图
- 由于Android系统基于Linux,进程间的用户空间不能共享
解决使用应用时接电话出现Crash问题
- 原因:页面回收导致本地变量置空
- 解决方案:
- 添加判空逻辑避免空指针问题
- 在页面回收生命周期中存储数据,页面重建时进行恢复
- onSaveInstanceState()中写如需要保存的数据
- onRestoreInstanceState()进行数据恢复