本文主要记录了Android开发过程中常用的Activity、Fragment、Service、Broadcast、ContentProvider、Intent六个基本组件及Handler、Binder两大通信组件的基本用法,如有错漏,感谢指正!
基础组件
1.1界面组件
Activity
需求-图片浏览器
-
实现一个图片浏览APP(Activity + Fragment)相册页面 + 大图页面 + 调用相机 (Intent)
-
旋转屏幕场景 (Activity生命周期)
-
内置升级能力 (Service使用)
-
单一首页 ( SingleTask )
-
相关图片(SingleTop)
-
扫描所有图片(ContentProvider
-
提供图片选择能力给系统 (Intent)
生命周期
- onCreate(): 创建时回调,一般在此处创建视图和绑定数据
- onStart(): 已启动,即将进入前台
- onResume(): 与用户开始交互,位于Activity栈顶
- onPause(): Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
- onStop(): Activity不再可见,下一个回调是onRestart()或onDestory()
- onRestart(): 重启已停止的Activity,下一个回调是onStart()
- onDestory(): 销毁Actvity,释放该Activity的所有资源
- onSaveInstanceState(): 在非正常关闭时回调,用于保存数据,不支持持久化数据
- onRestoreInstanceState() / onCreate(): 用于恢复数据
配置改变场景
- 销毁: Resumed - onSavelnstanceState() - onPause() onStop() onDestroyl)
- 重建: onCteate() . onStart() onRestorelnstanceState() - onResume()
配置改变不重建Activity: AndroidManifest中配置Activity节点的configChange属性
- local: 语言改变
- fontScale: 字体大小改变
- orientation: 旋转屏幕
- keybordHidden: 键盘显示隐藏
- onConfigurationChanged(): 配置改变
启动模式
- standard:默认模式,允许重复
- singleTop: 不允许连续重复
- singleTask: 不允许同个栈内重复
- singlelnstance:整个系统不允许重复
Fragment
基本用法
-
创建Fragment布局文件
-
创建Fragment子类,加载布局文件
-
Activity加载Fragment
3.1 静态加载:布局中绑定
3.2 动态加载: FragmentManager加载
生命周期
- onAttach():Fragment 和 Activity 建立关联时调用
- onCreateView():当Fragment 创建视图时调用
- onActivityCreated():Activity 的 onCreate() 方法已返回时调用
- onDestroyView):当Fragment中的视图被移除时调用
- onDetach():Fragment 和 Activity 取消关联时调用
-
启动: onAttach() - onCreate() onCreateView()-onActivityCreated() - onStart() - onResume() - Resumed
-
退出: Resumed - onPause() - onStop() - onDestoryView()-onDestory() - onDetach()
-
部分覆盖: Resumed - onPause()- Paused
-
部分遮挡恢复: Paused - onResume() - Resumed
-
完全覆盖: Resumed - onPause() - onStop()-onDestroyView()
-
完全遮挡恢复: onCreateView() - onActivityCreated()-onStart() - onResume()-Resumed
注: Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预
与Activity交互
组件获取
-
Fragment获取Activity中的组件: getActivity().findViewByld(R.id.xxx)
-
Activity获取Fragment中的组件: getFragmentManager.findFragmentByld(R.id.fragment xxx)
数据传递
-
Activity传数据给Fragment: setArguments(Bundle bundle)
-
Fragment传数据给Activity: a 通过对象直接传递 (方法调用 / 接口调用) b 通过viewmodel/ handler / broadcast / eventbus等通信
Service
基本用法
-
注册: AndroidManifest中使用<service.../>标签
-
创建: 建立相应的Service实现类
-
加载: startService() / bindService()
生命周期
onStart()——onBind()——onCreate()——onDestory()
与Activity交互
- 定义Binder子类,并实现getService()方法,返回Service对象
- 实现Service类onBind0)方法,返回上述Binder对象
- 实例化ServiceConnection对象,实现onServiceConnected0方法,从中获取到Service实例
- Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
- Activity既可以通过调用Service实例中的方法进行直接通信
Broadcast
基本用法
静态广播
- 注册: AndroidManifest中使用<receiver.../><intent-filter.../>
- 创建: 建立相应的BroadcastReceiver实现类
- 接收: 在步骤2类onReceive()中接收广播
- 发送: Context.sendBroadcast()
动态广播
注册: Context.registerReceiver()
常用系统广播
Intent.ACTION_CONNECTIVITY_CHANGE
Intent.ACTION_BATTERY_CHANGED
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 & ContentResolver
基本用法
生产者
-
注册: AndroidManifest中使用<provider.../>
属性: authorities / exported / readPermission / writePermission
-
创建: 建立相应的ContentProvider实现类
方法: onCreate / getType / insert / delete / update / query
消费者
-
声明:AndroidManifest中声明权限
-
使用:context.getContentResolver()方法: insert / delete / update / query
Intent
基本用法
-
Context.startActivity(lntent)
-
Context.startService(lntent)
-
Context.sendBroadcast(lntent)
-
显式Intent setComponent / setClass指定具体类
-
隐式Intent Action(动作) Data (数据) Category (类别) Type(数据类型) Component(组件) Extra(扩展信息) Flag (标志位)
系统能力
- 电话: Intent(lntent.ACTION DIAL, Uri.parse("tel:10010"))
- 短信: Intent(lntent.ACTION SENDTO, Uri.parse("smsto:10010"))
- 网页: Intent(lntent.ACTION VIEW, Uri.parse("www.baidu.com"))
- 邮件: Intent(lntent.ACTION SENDTO, Uriparse("mailto:someone@domain.com")
- 地图: Intent(lntent.ACTION_VIEW, Uri.parse("geo:39.9,116.3"))
- 拍照: Intent(MediaStore.ACTION IMAGE CAPTURE)
- 设置: Intent(android.provider.Settings.ACTION SETTINGS)
- 市场: Intent(lntent.ACTION VIEW, Uri.parse("market://details?id=" + packageName))
使用: startActivity(intent)
通信组件
Handler
线程间通信
基本用法
- 创建: 新建Handler,实现handleMessage(Message)
- 构造Message: what / setData()
- 发送: 子线程调用Handler.sendMessage(Message)发送Message
- 处理: 在Handler的handleMessage(Message msg)主线程更新UI
Binder
常见IPC对比(进程间通信,内存不共享,)
基本用法
服务端
- 定义一个AIDL文件
- 实现描述的接口,编写service
- 如果有实体类,需要提供实体类 (iar包形式)
客户端
- 拿到AIDL文件
- 绑定服务,获得接口持有对象