NO.7 Android组件课程笔记 | 青训营

85 阅读4分钟

本文主要记录了Android开发过程中常用的Activity、Fragment、Service、Broadcast、ContentProvider、Intent六个基本组件及Handler、Binder两大通信组件的基本用法,如有错漏,感谢指正!

基础组件

1.1界面组件

Activity

需求-图片浏览器

  1. 实现一个图片浏览APP(Activity + Fragment)相册页面 + 大图页面 + 调用相机 (Intent)

  2. 旋转屏幕场景 (Activity生命周期)

  3. 内置升级能力 (Service使用)

  4. 单一首页 ( SingleTask )

  5. 相关图片(SingleTop)

  6. 扫描所有图片(ContentProvider

  7. 提供图片选择能力给系统 (Intent)

生命周期

  • onCreate(): 创建时回调,一般在此处创建视图和绑定数据
  • onStart(): 已启动,即将进入前台
  • onResume(): 与用户开始交互,位于Activity栈顶
  • onPause(): Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
  • onStop(): Activity不再可见,下一个回调是onRestart()或onDestory()
  • onRestart(): 重启已停止的Activity,下一个回调是onStart()
  • onDestory(): 销毁Actvity,释放该Activity的所有资源
  • onSaveInstanceState(): 在非正常关闭时回调,用于保存数据,不支持持久化数据
  • onRestoreInstanceState() / onCreate(): 用于恢复数据

image.png

image.png

配置改变场景

  1. 销毁: Resumed - onSavelnstanceState() - onPause() onStop() onDestroyl)
  1. 重建: onCteate() . onStart() onRestorelnstanceState() - onResume()

配置改变不重建Activity: AndroidManifest中配置Activity节点的configChange属性

  • local: 语言改变
  • fontScale: 字体大小改变
  • orientation: 旋转屏幕
  • keybordHidden: 键盘显示隐藏
  • onConfigurationChanged(): 配置改变

启动模式

  • standard:默认模式,允许重复
  • singleTop: 不允许连续重复
  • singleTask: 不允许同个栈内重复
  • singlelnstance:整个系统不允许重复

image.png

Fragment

基本用法

  1. 创建Fragment布局文件

  2. 创建Fragment子类,加载布局文件

  3. Activity加载Fragment

    3.1 静态加载:布局中绑定

    3.2 动态加载: FragmentManager加载

生命周期

  • onAttach():Fragment 和 Activity 建立关联时调用
  • onCreateView():当Fragment 创建视图时调用
  • onActivityCreated():Activity 的 onCreate() 方法已返回时调用
  • onDestroyView):当Fragment中的视图被移除时调用
  • onDetach():Fragment 和 Activity 取消关联时调用
  1. 启动: onAttach() - onCreate() onCreateView()-onActivityCreated() - onStart() - onResume() - Resumed

  2. 退出: Resumed - onPause() - onStop() - onDestoryView()-onDestory() - onDetach()

  3. 部分覆盖: Resumed - onPause()- Paused

  4. 部分遮挡恢复: Paused - onResume() - Resumed

  5. 完全覆盖: Resumed - onPause() - onStop()-onDestroyView()

  6. 完全遮挡恢复: onCreateView() - onActivityCreated()-onStart() - onResume()-Resumed

    注: Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预

与Activity交互

组件获取
  1. Fragment获取Activity中的组件: getActivity().findViewByld(R.id.xxx)

  2. Activity获取Fragment中的组件: getFragmentManager.findFragmentByld(R.id.fragment xxx)

数据传递
  1. Activity传数据给Fragment: setArguments(Bundle bundle)

  2. Fragment传数据给Activity: a 通过对象直接传递 (方法调用 / 接口调用) b 通过viewmodel/ handler / broadcast / eventbus等通信

image.png

Service

基本用法

  1. 注册: AndroidManifest中使用<service.../>标签

  2. 创建: 建立相应的Service实现类

  3. 加载: startService() / bindService()

生命周期

onStart()——onBind()——onCreate()——onDestory()

与Activity交互

  1. 定义Binder子类,并实现getService()方法,返回Service对象
  2. 实现Service类onBind0)方法,返回上述Binder对象
  3. 实例化ServiceConnection对象,实现onServiceConnected0方法,从中获取到Service实例
  4. Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
  5. Activity既可以通过调用Service实例中的方法进行直接通信

Broadcast

基本用法

静态广播
  1. 注册: AndroidManifest中使用<receiver.../><intent-filter.../>
  2. 创建: 建立相应的BroadcastReceiver实现类
  3. 接收: 在步骤2类onReceive()中接收广播
  4. 发送: 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

基本用法

生产者

  1. 注册: AndroidManifest中使用<provider.../>

    属性: authorities / exported / readPermission / writePermission

  1. 创建: 建立相应的ContentProvider实现类

    方法: onCreate / getType / insert / delete / update / query

消费者

  1. 声明:AndroidManifest中声明权限

  2. 使用:context.getContentResolver()方法: insert / delete / update / query

Intent

基本用法

  1. Context.startActivity(lntent)

  2. Context.startService(lntent)

  3. Context.sendBroadcast(lntent)

  4. 显式Intent setComponent / setClass指定具体类

  5. 隐式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)

image.png

通信组件

Handler

线程间通信

基本用法

  1. 创建: 新建Handler,实现handleMessage(Message)
  2. 构造Message: what / setData()
  3. 发送: 子线程调用Handler.sendMessage(Message)发送Message
  4. 处理: 在Handler的handleMessage(Message msg)主线程更新UI

Binder

常见IPC对比(进程间通信,内存不共享,)

image.png

基本用法

服务端

  1. 定义一个AIDL文件
  2. 实现描述的接口,编写service
  3. 如果有实体类,需要提供实体类 (iar包形式)

客户端

  1. 拿到AIDL文件
  2. 绑定服务,获得接口持有对象

image.png