Android客户端 | 青训营笔记

105 阅读4分钟

Android客户端 | 青训营笔记

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

客户端基础知识必备

什么是程序

开发者视角

image.png

用户视角

image.png

基础组件

Android基础组件

界面组件(Activity & Fragment)

Activity

界面容器

image.png

需求——图片浏览器

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

引子:图片浏览器
相册列表页、相册图片页、大图浏览页

Activity基本用法

注册->布局->引用 相册列表页(GridView+Adaptor)
相册图片页(GridView+Adaptor)
大图浏览页(ViewPager+Adaptor)

引子:接个电话就Crash了

Activity(生命周期)

配置改变场景
1 销毁:Resumed-onSaveInstanceState()-onPause()-onStop()-onDestroy()
2 重建:oncteate()-onStart()-onRestoreInstate()-onResume()

配置改变不重建Activity:AndroidManifest中配置Activity节点的configChange属性
local:语言改变
fontScale:字体大小改变
orientation:旋转屏幕
keybordHidden:键盘显示隐藏
配置改变:onConfigurationChanged()

Activity(生命周期小结)

image.png 方案:解决接电话Crash问题
问题原因:页面被回收导致本地变量被置空
问题解决:
1 添加判空逻辑避免空指针问题
2 在页面回收生命周期中储存数据,页面重建时进行恢复
onSaveInstanceState()中写入需要保存的数据
onRestoreInstanceState()进行数据恢复

引子:加入主页按钮能力

多个首页问题:加入主页按钮后,点击会在当前页面栈加入新首页,返回后手也会消失。

预期:点击首页按钮回到首页,上面的页面全部退出。

解决:将首页launchmode设置为singleTask

Activity(启动模式-standard)

image.png standard:默认模式,允许重复

Activity(启动模式-single——Top)

image.png singleTop:不允许连续重复

Activity(启动模式-single-Task)

image.png singleTask:不允许同个栈内重复

Activity(启动模式-singleInstance)

image.png 整个系统不允许重复

Activity(启动模式总结)

image.png

Fragment

碎片化

速度快

Fragment(基本用法)

1 创建Fragment布局文件
2 创建Frangment子类,加载布局文件
3 Activity加载Fragment
3.1静态加载:布局中绑定
3.2动态加载:FragmentManager加载

Fragment(生命周期)

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

image.png

Fragment(与Activity交互)

组件获取
Fragment获取Activity中的组件:getActivity().findViewByld(R..id.xxx)
1 Activity获取Fragment中的组件:getFragmentManager.findFragmentByld(R.id.fragment_xxx)

数据传递
1 Activity传数据给Fragment:setArguments(Bundle bundle)
2 Fragment传数据给Activity:
a 通过对象直接传递(方法调用/接口调用)
b 通过viewmodel/handler/broadcast/eventbus等通信

Fragment(总结)

image.png

服务组件(Service)

Service(基本用法)

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

Service(生命周期)

onStart()
onBind()
onCreate()
onDestory()

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)

Broadcast()基本用法

静态广播

1注册: AndroidManifest p使用<receive../><intent-ilt.r..>
2创建:建立相应的BroadcastReceiver实现类
3接收:在步骤2类onReceive()中接收广播
4发送: Context.sendBroadcastQ

动态广播
注册: Context.registerReceiver()

Broadcast(常用系统广播)

Intent ACTION_ CONNECTIVITY CHANGEIntent.ACTION_ BATTERY_ CHANGED
IntentACTION_ SCREEN ON
Intent.ACTION_ SCREEN_ OFF
Intent.ACTION_ PACKAGE INSTALLIntentACTION_ BOOT COMPLETED
Intent.AC TION PACKAGE ADDED
Intent.AC TION_ PACKAGE_ REPL ACEDIntent. ACTION_ PACKAGE_ REMOVED

数据组件(ContentProvider & ContentResolver)

ContentProvider
ContentProvider基本用法

生产者
1 注册:AndroidManifest中使用<provider.../>
属性:authorities/exported/readPermission/writePermission
2 创建:建立相应的ContentProvider实现类
方法:onCreate/getType/insert/delete/update/query

消费者
1 声明:AndroidManifest中声明权限
2 使用:context.getContentResollver()
方法:insert/delete/update/query

解决:扫描系统现有图片

Intent

1 Context.starActivity(Intent) 2 Context.starService(Intent) 3 Context.sendBroadcast(Intent)

image.png

Intent(基本用法)

1 显式Intent
setComponent/setClass指定具体类

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

Intent(系统能力)

![VIXBF}53]2}]FX4J7ILPV.png](p6-juejin.byteimg.com/tos-cn-i-k3…?)

总结

image.png

通信组件

Handler

Handler(基本用法)

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

Handler(核心原理)

image.png

Binder

Binder(常用IPC方案对比)

image.png

Binder(为啥不用共享内存)

image.png Linux的进程隔离

Binder(基本用法)

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

客户端
1 拿到AIDL文件
2 绑定服务,获得接口持有对象

Binder(核心原理)

image.png

image.png

Binder(App启动)

image.png

总结

image.png

image.png