Android常用组件

前言

认知方法

  • what
  • why
  • how

什么是程序

  • what
    • 代码 + 资源
  • why
    • 改变世界
  • how
    • 知识 + 经验

用户视角

  • what
    • 界面
    • 互动
    • 记忆
  • why
    • 工具
    • 视频
    • 游戏
  • how
    • 应用商店
    • 搜索引擎
    • 官网下载
    • 三方引流

基础组件

需求

需求-图片浏览器

  • 实现一个图片浏览APP(Activity + Fragment)
  • 相册页面 + 大图页面 + 调用相机 (Intent)
  • 旋转屏幕场景 (Activity生命周期)
  • 内置升级功能(Service使用)
  • 单一首页(SingleTask)
  • 相关照片(SingleTop)
  • 扫描所有照片(ContentProvider)
  • 提供照片选择能力给系统(Intent)

1659276922323

界面组件

  • Activity

    • what

    1659195347602

    • why

    1659195285061

    • how

      • 基本用法

      1659276954948

      • 生命周期

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

      • 1659278019755

      • 1659278067698

    • 生命周期小结

    1659278260249

    • 启动模式
      • standard:默认模式,允许重复
        • 1659278405707
      • singleTop:不允许连续重复
        • 1659278389099
      • singleTask:不允许同个栈内重复
        • 1659278373188
      • singleInstance:整个系统不允许重复
        • 1659278448804
    • 启动模式总结
      • 1659278476645
  • Fragment

    • 特点:

      • 碎片化
      • 速度快
    • 基本用法

      1. 创建Fragment布局文件
      2. 创建Fragment子类,加载布局文件
      3. Activity加载Fragment
        1. 静态加载:布局中绑定
        2. 动态加载:FragmentManager加载
    • 生命周期

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

      1659278900202

    • 与Activity交互

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

      1659279165812

服务组件

  • Service

    • 基本用法

      1. 注册:AndroidManifest中使用<service…/>标签
      2. 创建:建立相应的Service实现类
      3. 加载:startService() / bindService()
    • 生命周期

      • onStart()
      • onBind()
    • onCreate()

      • onDestroy()

      1659279397480

    • 与Activity通信

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

广播组件

  • BroadCast
    • 基本用法

      • 静态广播
        1. 注册:AndroidManifest中使用<receiver…/><intent-filter…/>
        2. 创建:建立相应的BroadcastReceiver实现类
        3. 接收:在步骤2类onReceive()中接收广播
        4. 发送:Context.sengBroadcast()
      • 动态广播
        1. 注册:Context.registerReceiver()
    • 常用系统广播

      1659281586981

数据组件

  • ContentProvider

    • 基本用法

      • 生产者

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

          属性:authorities/exported/readPermission/writePermission

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

          方法:onCreate/getType/inset/delete/udate/query

      • 消费者

        1. 声明:AndroidManifest中声明权限

        2. 使用:context。getContentResolver()

          方法:insert/delete/update/query

意图组件

  • Intent

    1. Context.startActivity(Intent)
    2. Context.startService(Intent)
    3. Context.sendBroadcast(Intent)

    1659282114260

    • 基本用法

      1. 显式Intent

        setComponent / setClass指定具体类

      2. 隐式Intent

        Action(动作) Data(数据) Category(类别) Type(数据类型) Component(组件) Extra(扩展信息) Flag(标志位)

    • 系统能力

      1659282338462

Android通信组件

  • Handler

    • 基本用法

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

      1659282536629

  • Binder

    • 常用IPC方案对比

      1659282589415

    • 为什么不用共享内存

      1659282616967

    • 基本用法

      • 服务端
        1. 定义一个AIDL文件
        2. 实现描述的接口,编写service
        3. 如果有实体类,则需要提供实体类(jar包形式)
      • 客户端
        1. 拿到AIDL文件
        2. 绑定服务,获得接口持有对象
    • 核心原理

      1659282707287

      1659282720146

    • App启动

      1659282745737

总结

1659282770509