Android组件|青训营笔记

62 阅读4分钟

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

本节课主要内容为讲解Android常用组件

三个方向思考
什么是程序
开发者视角:
What:代码+资源
why:改变世界
How:知识+经验
用户视角:
What:界面、互动、记忆
Why:工具、视频、游戏...
How:应用商店、搜索引擎、官网下载、三方引流

详细讲解分为以下几个方面:

1,Android基础组件

1.1 界面组件(Activity&Fragment)

what:
界面容器

5B66464A994604A4CD08EA1A9D4B5921.jpg

why:

A5BAF9282743A1829CA4027BA561FCD3.jpg

需求-图片浏览器
1 实现一个图片浏览app(Activity+Fragment)
相机页面+大图页面+调用相机(Intent)
2 旋转屏幕场景(Activity生命周期)
3 内置升级能力(Service使用)
4 单一首页(SingleTask)
5 相关图片(SingleTop)
6 扫描所有图片(ContentProvider)
7 提供图片选择能力给系统(Intent)
Acivity(基本用法)
Activity(生命周期)
·onCreate():创建时回调,一般在此处创建视图和绑定数据
·onStart():已启动,即将进入前台
·onResume():与用户开始交互,位于Activity栈顶
·onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
·onStop():ACtivity不再可见,下一回调是onRestart()或onDestory()
·onDestory():销毁Activity,释放该Activity的所有资源
·onSavelnstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
·onRestorelnstanceAtate()/onCreate():用于恢复数据

FCF78EC52A5890648BB0AB9075D6AE36.jpg

打开页面:1-2-3
关闭页面:4-5-6

C8F28BA6AE7EA67F1E4EEAD1BCE46625.jpg

1页面全遮挡
234遮挡恢复
配置改变场景
1 销毁:Resumed-onSavelnstanceState()-onPause()-onStop()-onDestroy()
2 重建:onCteate()-onStart()-onRestorelnstanceState()-onResume()

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

FD332AE0BFE128973470ACF576D8C72C.jpg

方案:解决接电话Crash问题
问题原因:页面被收回导致本地变量被置空
问题解决:
1 添加判空逻辑避免空指针问题
2 再页面回收生命周期中储存数据,页面重建时进行恢复
onSavelnstanceState()中写入需要保存的数据
onRestorelnstanceState()进行数据恢复
Activity(启动模式-standard)

9BCB1AE47A40C8D71355E58BAD9690FD.jpg

1.2 Fragment

1 创建Fragment布局文件
2 创建Fragment子类,加载布局文件
3 Activity加载Fragment
3.1 静态加载:布局中绑定
3.2 动态加载:FragmentManager加载
启动:onAttach()-onCreate()-onCreateView()-onActivityCreated()-onStart()-onResume()-Resumed
退出:Resumed-onPause()-onStop()-onDestoryView()-onDestory()-onDetach()
部分覆盖:Resumed-onPause()-Paused
部分遮挡恢复:Resumed-onPause()-onStop
完全覆盖:Resumed-onPause()-onstop()-onDestoryView()
完全遮挡恢复:onCreateView()-onActivityCreated()-onStart()-onResume()-Resumed
注:Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预
Fragment总结

F2A781B6F488BE44FF7FED19E84013D3.jpg

1.3 Service

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

D37B20E73753F1C80B79E33071801204.jpg

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

1.4 Boroadcast

基本用法 静态广播
1 注册:AndroidManifest中使用<receiver.../><intent-filter.../>
2 创建:建立相应的BoradcastReceiver实现类
3 接受:在步骤2类onReceive()中接收广播
4 发送:Context.sendBroadcast()\

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

常用广播:
Intent.ACTION_CONNECTIVITY_cHANGE
Intent.ACTION_BATTERY_CHANGED
Intent.ACTION_SCREEN_ON
Intent.ACTION_SCREEN_OFF
Intent.ACTION_PACKAGE_INSTALL
Intent.ACTION_B0OT_cOMPLETED
Intent.ACTION_PACKAGE_ADDED
Intent ACTION_PACKAGE_REPLACED
Intent.ACTION_PACKAGE_REMOVED

1.5 ContentProvider

基本用法
生产者
1 注册:AndroidManifest中使用<provider.../>
属性: authorities/exported/readPermission/writePermission
2 创建:建立相应的ContentProvider实现类
方法:onCreate/getType/insert/delete/update/query
消费者
1 声明:AndroidManifest中声明
2 使用:context.getContentResolver()
方法:insert/delete/updata/query

1.6 Intent

1 Context.startActivity(Intent)
2 Context.startService(Intent)
3 Context.sendBrodcast(Intent)

62C361BFC3D4CB013BF7AE6AC755F580.jpg

基本用法 1 显式Intent
setComponent/setClass指定具体类
2 隐式Intent
Action(动作)
Data(数据)
Category(类别)
Type(数据类型)
Component(组件)
Extra(扩展信息)
Flag(标志位)
系统能力 电话: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"))
地图:lntent(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)

1.7 总结

C273EDCE698D2550217B79409E33ACF1.jpg

2,Android通信组件

2.1 Handler

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

EBB087756C9A08989BD257E68383AA19.jpg

2.2 Binder

常用IPC方案对比

C028016D0BE6551CB20E5C9FFF64EBCB.jpg

为啥不用共享内存
Linux的进程隔离 E2FED9E6DF7DEB0FFE0A0F20B94010BA.jpg

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

FF2B9DA0FE2A97FF63BFA3AD0207048C.jpg

App启动

440A6A2DE57F8B160F59740FC5AC669D.jpg

2.3总结

0543182330F2D9BAFADE6D2FA6936996.jpg

3,总结

2AD3C6C62AA45B6FBE4EB9C9154BBE0E.jpg

本次课程基于Android组件对Android有了更深层次的了解,了解了程序的启动以及各组件间的工作方式,大概原理,基本用法。