这是我参与「第四届青训营 」笔记创作活动的第2天。
以下是第二堂课的笔记和总结
Android常用组件
Android基础组件
Activity
- 界面容器(最重要的组件)
用于前台交互、程序入口和布局容器
-
基本用法:
-
在AndroidManifest.xml中声明注册,可在
<intent-filter/>设置默认启动界面; -
在布局文件中设置布局;
-
在Activity.class文件中与布局进行绑定,并实现需要的逻辑。
-
-
生命周期
-
onCreate():
创建时回调,一般用于创建视图和绑定数据。
-
onStart():
已启动,即将进入前台。
-
onResume():
与用户开始交互,位于Activity栈顶。
-
onPause():
Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()。
-
onStop():
Activity不再可见,下一个回调的是onRestart()或onDestory()。
-
onRestart():
重启已停止的Activity,下一个回调的是onStart()。
-
onDestory():
销毁Activity,释放该Activity的所有资源。
-
onSaveInstanceState():
在非正常关闭时回调,用于保存数据,不支持持久化数据。
-
onRestoreInstanceState():/onCreate():
用于恢复数据。
黑体部分可用于数据恢复,避免如接电话造成的数据丢失。
-
-
配置改变不重建Activity
AndroidManifest中配置Activity节点的configChange属性:
- local:语言改变
- fontScale:字体大小改变
- orientation:旋转屏幕
- keybordHidden:键盘显示隐藏
配置改变:onConfigurationChange():
-
启动模式
- standard:默认模式,运行重复
- singleTop:栈顶复用,不允许连续重复
- singleTask:栈内复用,不允许同一个栈内重复
- singleInstance:全局复用,整个系统不允许重复
Fragment
-
页面容器(为解决碎片化而出现)
相对于Activity,速度快,常用于组件分离。
-
基本用法
-
创建布局文件
-
创建子类
-
Activity加载Fragment
- 静态加载:布局绑定
- 动态加载:FragmentManager加载
-
-
生命周期
-
onAttach():
Fragment和Activity建立关联时调用
-
onCreateView():
Fragment创建视图时调用
-
onActivityCreated():
Activity的onCreate()方法已返回时调用
-
onDestroyView():
Fragment中的视图被移除时调用
-
onDetach():
Fragment和Activity取消关联时调用
-
-
与Activity交互
-
组件获取
Fragment获取Activity组件:
- getActivity().findViewById(R.id.xxx)
Activity获取Fragment组件:
- getFragmentManager.findFragmentById(R.id.fragment_xxx)
-
数据传递
Activity传数据给Fragment:
- setArguments(Bundle bundle)
Fragment传数据给Activity:
- 通过对象直接传递(方法调用/接口调用)
- tonggviewmodel/handler/broadcast/eventbus等通信
-
Service
-
服务组件
如后台播放音乐、下载文件。
-
基本用法
- 在AndroidManifest中使用
<service/>标签注册 - 建立相应的Service实现类
- 用startService()(不交互)/bindService()(交互)启动加载
- 在AndroidManifest中使用
-
生命周期
- onStart():
- onBind():
- onCreate():
- onDestory():
-
与Activity通信
- 定义Binder子类,并实现getService()方法,返回Service对象
- 实现Service类onBind()方法,返回上述Binder对象
- 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
- Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,跑起流程
- Activity可以通过调用Service实例中的方法进行直接通信
Broadcast
-
通知系统器件通过广播,将一些状态通知给应用
-
基本用法
-
静态广播
- 在AndroidManifest中使用
<receiver.../><intent-filter.../>注册 - 建立相应的BroadcastReceiver实现类
- 在步骤2类onReceive()接受广播
- Context.sendBroadcast()发送广播
- 在AndroidManifest中使用
-
动态广播
Context.registerReceiver()
-
-
常用广播(可能需要权限)
-
Intent.ACTION_CONNECTIVITY_CHANGE
网络发生变化
-
Intent.ACTION_BATTERY_CHANGE
电量发生变化
-
Intent.ACTION_SCREEN_ON
屏幕开启
-
Intent.ACTION_SCREEN_OFF
屏幕关闭
-
Intent.ACTION_PACKAGE_INSTALL
安装应用程序
-
Intent.ACTION_BOOT_COMPLETED
系统启动完成
-
Intent.ACTION_PACKAGE_ADDED
安装程序
-
Intent.ACTION_PACKAGE_REPLACED
程序更新
-
Intent.ACTION_PACKAGE_REMOVED
卸载程序
-
ContentProvider
-
数据通信(不常用)
-
基本用法
-
生产者
-
AndroidManifest注册
<provider.../>属性:authorities/exported/readPermission/writePermission
-
建立相应的ContentProvider实现类
方法:onCreate/getType/insert/delete/update/query
-
-
消费者
-
AndroidManifest声明权限
-
使用context.getContentResolver()
方法:insert/delete/update/query
-
-
Intent
-
表达意图
- Context.startActivity(Intent)
- Context.startService(Intent)
- Context.startBroadcast(Intent)
-
隐式和显式
-
可调用系统能力
如电话、网页、拍照、设置和地图等。
Android通信组件
Handler
-
线程通信
耗时操作要放在子线程
-
基本用法
- 新建Handler,实现handleMessage(Message)
- 构造Message:what/setData()
- 子线程调用Handler.sendMessage(Message)发生Message
- 在Handler的handleMessage(Message msg)主线程更新UI
Binder
-
线程间通信
数据只拷贝一次,效率提高
-
基本用法
- 服务端
- 定义AIDL文件
- 实现描述的接口,编写service
- 如有实体类,需提供实体类(jar包形式)
- 客户端
- 拿到AIDL文件
- 绑定服务,获得接口持有对象
- 服务端
-
原理
- 匿名共享内存
- Binder驱动
- ServiceManager
总结
这一堂课主要学习了Android开发中经常会用到的组件,老师详细地介绍了各个组件的应用场景和基本用法,补充了我对Android组件的部分知识漏洞,干货满满,特此做下笔记,以便在实际应用时,遇到问题能够及时查漏补缺。