初识Android-常用组件 | 青训营笔记

104 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第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()
    • 流程图 Activity生命周期图.png
  • 启动模式
    • Standard:默认模式,允许Activity重复
    • SingleTop:栈顶复用,不允许Activity连续重复
    • SingleTask:栈内复用,不允许栈内Activity重复
    • SingleInstance:全局复用,系统全局不允许Activity重复

2. Fragment轻量级界面容器

  • 作用

    • 解决屏幕尺寸碎片化问题
    • 轻量级页面容器
  • 基本用法

    1. 创建Fragment布局文件
    2. 创建Fragment子类,加载布局文件
    3. 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()手动干预)
    • 流程图 ![Fragment生命周期图.png](p3-juejin.byteimg.com/tos-cn-i-k3…
  • Fragment与Activity交互

    • 组件获取
      • Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx)
      • Activity获取Fragment中的组件:getFragmentManager.findFragmentById(R.id.fragment_xxx)
    • 数据传递
      • Activity传递数据给Fragment:setArguments(Bundle bundle)
      • Fragment传递数据给Activity:
        1. 通过对象直接传递(方法调用/接口调用)
        2. 通过viewmodel/handler/broadcast/eventbus等通信

3. Service后台服务

  • 基本用法
    1. 注册:AndroidMainfest中使用<service.../>标签
    2. 创建:建立相应的Sercive实现类
    3. 加载:startService()/bindService()
  • Service与Activity通信
    1. 定义Binder子类,并实现getService()方法,返回Service对象
    2. 实现Service类onBinder()方法,返回上述Binder()对象
    3. 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实力
    4. Activity中调用binderService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
    5. Activity既可以通过调用Service实例中的方法进行直接通信
  • Service生命周期
    • 流程图

Service生命周期图.png

4. Broadcast广播组件

  • 基本用法
    • 静态广播
      1. 注册:AndroidMainfest中使用<receiver.../><intent-filter.../>
      2. 创建:建立相应的BroadcastReceive实现类
      3. 接受:在步骤2类onReceive()中接受广播
      4. 发送: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数据组件

  • 基本用法
    • 生产者
      1. 注册:AndroidMainfest中使用<provider.../>
      2. 属性:authorities/exported/readPermission/writePermission
      3. 创建:建立相应的ContentProvider实现类
      4. 方法:onCreate/getType/insert/delete/update/query
    • 消费者
      1. 声明:AndroidMainfest中声明权限
      2. 使用:context.getContentResolver()
      3. 方法:insert/delete/update/query

6. Intent意图组件

  • 基本用法
    • 显示Intent
      • setComponent/setClass指定具体类
    • 隐式Intent
      • Action(动作)
      • Data(数据)
      • Category(类别)
      • Type(数据类型)
      • Component(组件)
      • Extra(扩展信息)
      • Flag(标志位)
  • 系统能力
    • 电话: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线程通信

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

2. Binder进程通信

  • 基本用法
    • 服务端
      1. 定义一个AIDL文件
      2. 实现描述的接口,编写service
      3. 如果有实体类,需要提供实体类(jar包形式)
    • 客户端
      1. 拿到AIDL文件
      2. 绑定服务。获得接口持有对象
  • APP启动流程图 BinderAPP启动图.png
  • 由于Android系统基于Linux,进程间的用户空间不能共享 Binder内存不共享.png Binder核心图.png

解决使用应用时接电话出现Crash问题

  • 原因:页面回收导致本地变量置空
  • 解决方案:
    1. 添加判空逻辑避免空指针问题
    2. 在页面回收生命周期中存储数据,页面重建时进行恢复
      • onSaveInstanceState()中写如需要保存的数据
      • onRestoreInstanceState()进行数据恢复