客户端基础知识必备|青训营第二课笔记

55 阅读4分钟

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

本节课知识点:Android基础组件通信组件

一、基础组件

包括:界面组件(Activity & Fragment)、服务组件(Service)、广播组件(Broadcast)、数据组件(ContentProvider & ContentResolver)

1 Activity

Activity是用于展示数据,实现与用户的交互的容器。

Activity生命周期

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

5bf1d304d60749baa7b87a7a44dca09f_tplv-k3u1fbpfcp-zoom-in-crop-mark_3024_0_0_0.webp

image.png

配置改变场景

1 销毁:Resumed - onSaveInstanceState() - onPause() - onStop() - onDestroy()

2 重建:onCteate() - onStart() - onRestoreInstanceState() - onResume()

配置改变不重建Activity: AndroidManifest中配置Activity节点的configChange属性

local:语言改变

fontScale:字体大小改变orientation:旋转屏幕

keybordHidden:键盘显示隐藏

配置改变:onConfigurationChanged()

Activity启动模式:

Standard:默认模式,允许重复

SingleTask:不允许连续重复

SingleTop:不允许同个栈内重复

SingleInsTance:整个系统不允许重复

image.png

小结

image.png

2 Fragment

Fragment 表示 FragmentActivity 中的行为或界面的一部分。可以在一个 Activity 中组合多个片段,从而构建多窗格界面;也可以在多个 Activity 中重复使用某个片段。可以将 Fragment 视为 Activity 的模块化组成部分。

Fragment生命周期

onAttach() 在Fragment 和 Activity 建立关联是调用(Activity 传递到此方法内)
onCreateView() 当Fragment 创建视图时调用
onActivityCreated() 在相关联的 Activity 的 onCreate() 方法已返回时调用。
onDestroyView() 当Fragment中的视图被移除时调用
onDetach() 当Fragment 和 Activity 取消关联时调用。

image.png

Fragment与Activity交互

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

小结

image.png

Service

基本用法

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

Service生命周期

image.png

Service与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()

Broadcast常用系统广播

Intent.ACTION_CONNECTIVITY_CHANGE
Intent.ACTION_BATTERY_CHANGED
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 I getType / insert / delete / update / query
消费者
1 声明:AndroidManifest中声明权限
2 使用:context.getContentResolver()
方法:insert / delete / update / query

Intent

image.png

基本用法

1 显式lntent
setComponent / setClass指定具体类
2 隐式Intent
Action(动作)
Data(数据)
Category(类别)
Type(数据类型)
Component(组件)
Extra(扩展信息)
Flag(标志位)

Intent系统能力

电话:Intent(Intent.ACTION_DIAL, Uri.parse("tel:10010"))
短信:Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:10010"))
网页:Intent(Intent.ACTION_VIEW, Uri.parse("www.baidu.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, Uri.parse("market://details?id="+ packageName))
使用:startActivity(intent)

总结

image.png

二、通信组件

包括:Handler、Binder

Handler

基本用法

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

Handler核心原理

image.png

Binder

基本用法

服务端\

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

Binder核心原理

image.png

image.png

Binder APP启动

image.png

Binder小结

image.png

总结

image.png