这是我参与「第四届青训营 」笔记创作活动的第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
核心原理
- 异步通信准备
- 消息发送
- 消息循环
- 消息处理\
注意
线程(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
三、结语
以上只是我对课程的一个概括总结, 更多详尽知识请自己搜索查找