Android常用组件 | 青训营笔记

158 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第2天。

以下是第二堂课的笔记和总结

Android常用组件

Android基础组件

Activity
  • 界面容器(最重要的组件)

用于前台交互、程序入口和布局容器

  • 基本用法:

    1. 在AndroidManifest.xml中声明注册,可在<intent-filter/>设置默认启动界面;

    2. 在布局文件中设置布局;

    3. 在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,速度快,常用于组件分离。

  • 基本用法

    1. 创建布局文件

    2. 创建子类

    3. 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
  • 服务组件

    如后台播放音乐、下载文件。

  • 基本用法

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

    • onStart():
    • onBind():
    • onCreate():
    • onDestory():
  • 与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.sendBroadcast()发送广播
    • 动态广播

      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
  • 数据通信(不常用)

  • 基本用法

    • 生产者

      1. AndroidManifest注册<provider.../>

        属性:authorities/exported/readPermission/writePermission

      2. 建立相应的ContentProvider实现类

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

    • 消费者

      1. AndroidManifest声明权限

      2. 使用context.getContentResolver()

        方法:insert/delete/update/query

Intent
  • 表达意图

    1. Context.startActivity(Intent)
    2. Context.startService(Intent)
    3. Context.startBroadcast(Intent)
  • 隐式和显式

  • 可调用系统能力

    如电话、网页、拍照、设置和地图等。

Android通信组件

Handler
  • 线程通信

    耗时操作要放在子线程

  • 基本用法

    1. 新建Handler,实现handleMessage(Message)
    2. 构造Message:what/setData()
    3. 子线程调用Handler.sendMessage(Message)发生Message
    4. 在Handler的handleMessage(Message msg)主线程更新UI
Binder
  • 线程间通信

    数据只拷贝一次,效率提高

  • 基本用法

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

    • 匿名共享内存
    • Binder驱动
    • ServiceManager

总结

这一堂课主要学习了Android开发中经常会用到的组件,老师详细地介绍了各个组件的应用场景和基本用法,补充了我对Android组件的部分知识漏洞,干货满满,特此做下笔记,以便在实际应用时,遇到问题能够及时查漏补缺。