Android客户端 | 青训营笔记
这是我参与「第四届青训营 -Android场」笔记创作活动的的第2天
客户端基础知识必备
什么是程序
开发者视角
用户视角
基础组件
Android基础组件
界面组件(Activity & Fragment)
Activity
界面容器
需求——图片浏览器
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(生命周期小结)
方案:解决接电话Crash问题
问题原因:页面被回收导致本地变量被置空
问题解决:
1 添加判空逻辑避免空指针问题
2 在页面回收生命周期中储存数据,页面重建时进行恢复
onSaveInstanceState()中写入需要保存的数据
onRestoreInstanceState()进行数据恢复
引子:加入主页按钮能力
多个首页问题:加入主页按钮后,点击会在当前页面栈加入新首页,返回后手也会消失。
预期:点击首页按钮回到首页,上面的页面全部退出。
解决:将首页launchmode设置为singleTask
Activity(启动模式-standard)
standard:默认模式,允许重复
Activity(启动模式-single——Top)
singleTop:不允许连续重复
Activity(启动模式-single-Task)
singleTask:不允许同个栈内重复
Activity(启动模式-singleInstance)
整个系统不允许重复
Activity(启动模式总结)
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取消关联时调用
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(总结)
服务组件(Service)
Service(基本用法)
1 注册:AndroidManifest中使用<service.../>标签
2 创建:建立相应的Service实现类
3 加载: startService()/bindService()
Service(生命周期)
onStart()
onBind()
onCreate()
onDestory()
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)
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…?)
总结
通信组件
Handler
Handler(基本用法)
1 创建:新建Handler,实现handleMessage(Message)
2 构造Message:what/setData()
3 发送子线程调用Handler.sendMessage(Message)发送Message
4 处理:在HandleMessage(Message msg)主线程更新UI
Handler(核心原理)
Binder
Binder(常用IPC方案对比)
Binder(为啥不用共享内存)
Linux的进程隔离
Binder(基本用法)
服务端
1 定义一个AIDL文件
2 实现描述的接口,编写service
3 如果有实体类,需要提供实体类(jar包形式)
客户端
1 拿到AIDL文件
2 绑定服务,获得接口持有对象