Android客户端基础知识 | 青训营笔记

139 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第2天
今天我们学习了Android客户端相关的一些基础知识——Android组件,分为基础组件和通信组件,以下是从基本用法、生命周期、核心原理等方面的详细介绍。

一、基础组件

1、界面组件

1.1、Activity

可以进行前台交互、作为程序入口和布局容器

基本用法

注册、布局、绑定

生命周期

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

启动模式(launchMode)

  • standard:默认模式,允许Activity重复
  • singleTop:栈顶复用,不允许Activity连续重复
  • singleTask:栈内复用,不允许同个栈内Activity重复
  • singleInstance:全局复用,整个系统不允许Activity重复

1.2、Fragment

可以进行设备设配和作为页面容器(轻量型),具有碎片化、速度快的特点

基本用法

1、创建Fragment布局文件

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

3、Activity加载Fragment

   ~~~ 静态加载:布局中绑定

   ~~~ 动态加载:FragmentManager加载

生命周期

  • onAttach() Fragment和Activity建立关联时调用

  • onCreateView() 当Fragment创建视图时调用

  • onActivityCreated() Activity的onCreate()方法已返回时调用

  • onDestroyView() 当Fragment中的视图被移除时调用

  • onDetach() Fragment和Activity取消关联时调用

与Activity交互

1、组件获取

1、Fragment获取Activity中的组件:getActivity() 2、Activity获取Fragment中的组件:getFragmentManager.findFragmentByld()

2、数据传递

1、Fragment传数据给Activity:
   ~~~ 1)通过对象直接传递(方法调用或接口调用);
   ~~~ 2)通过viewmodel / handler / broadcast 等通信(异步方式)
2、Activity传数据给Fragment:setArguments()

2、服务组件 Service

基本用法

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

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

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

生命周期

  • onStart()

  • onBind()

  • onCreate()

  • onDestroy()

与Activity通信

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

3、广播组件 Broadcast

基本用法

1、静态广播

1、注册:AndroidManifest中使用<receiver.../><intent-filter.../>

2、创建:建立相应的BroadcastReceiver实现类

3、接收:在步骤2类onReceive()中接收广播

4、发送:Context.sendBroadcast()

2、动态广播

注册:Context.registerReceiver()

常用系统广播

Intent.ACTION_CONNECTIVITY_CHANGE #监听网络变化
Intent.ACTION_BATTERY_CHANGED     #充电时或电量发生变化
Intent.ACTION_SCREEN_OFF          #屏幕被关闭 
Intent.ACTION_SCREEN_ON           #屏幕被打开
Intent.ACTION_PACKAGE_ADDED       #成功安装APK
Intent.ACTION_BOOT_COMPLETED      #系统启动完成后(仅广播一次)

4、数据组件 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

5、意图组件 Intent

基本用法

1、显式Intent

setComponent / setClass 指定具体类

2、隐式Intent

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

二、通信组件

1、Handler 线程通信

基本用法

1、创建:新建Handler,实现handleMessage(Message)

2、构造Message:what/setData()

3、发送:子线程调用Handler.sendMessage(Message)发送Message

4、处理:在Handler的handleMessage(Message msg)主线程更新UI

核心原理

image.png

  1. 异步通信准备
  2. 消息发送
  3. 消息循环
  4. 消息处理\

注意

线程(Thread)、循环器(Looper)、处理者(Handler)之间的对应关系如下:

  • 1个线程(Thread)只能绑定1个循环器(Looper),但可以有多个处理者(Handler)
  • 1个循环器(Looper)可绑定多个处理者(Handler)
  • 1个处理者(Handler)只能绑定1个1个循环器(Looper)

2、Binder 进程通信

基本用法

服务端

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

客户端

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

核心原理

1、匿名共享内存
2、Binder驱动:连接Service进程、Client进程和Service Manager的桥梁,通过内存映射(调用函数)来实现
3、ServiceManager

三、结语

以上只是我对课程的一个概括总结, 更多详尽知识请自己搜索查找