这是我参与「第四届青训营 」笔记创作活动的第2天
本节课主要内容为讲解Android常用组件
三个方向思考
什么是程序
开发者视角:
What:代码+资源
why:改变世界
How:知识+经验
用户视角:
What:界面、互动、记忆
Why:工具、视频、游戏...
How:应用商店、搜索引擎、官网下载、三方引流
详细讲解分为以下几个方面:
1,Android基础组件
1.1 界面组件(Activity&Fragment)
what:
界面容器
why:
需求-图片浏览器
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():用于恢复数据
打开页面:1-2-3
关闭页面:4-5-6
1页面全遮挡
234遮挡恢复
配置改变场景
1 销毁:Resumed-onSavelnstanceState()-onPause()-onStop()-onDestroy()
2 重建:onCteate()-onStart()-onRestorelnstanceState()-onResume()
配置改变不重建ACtivity:AndroidManifeset中配置Activity节点的configChange属性
local:语言改变
fontScale:字体大小改变
orientation:旋转屏幕
keybordHidden:键盘显示隐藏
配置改变:onConfigurationChanged()
生命周期小结
方案:解决接电话Crash问题
问题原因:页面被收回导致本地变量被置空
问题解决:
1 添加判空逻辑避免空指针问题
2 再页面回收生命周期中储存数据,页面重建时进行恢复
onSavelnstanceState()中写入需要保存的数据
onRestorelnstanceState()进行数据恢复
Activity(启动模式-standard)
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总结
1.3 Service
onStart()/onBind()/onCreate()/onDestory()
与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)
基本用法
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 总结
2,Android通信组件
2.1 Handler
基本用法
1 创建:新建Hanlder,实现handleMessage(Message)
2 构建Message:what/setData()
3 发送:子线程调用Handler.sendMessage(Message)发送Message
4 处理:在Handler的handleMessage(Message msg)主线程更新UI
核心原理
2.2 Binder
常用IPC方案对比
为啥不用共享内存
Linux的进程隔离
基本用法
服务端
1 定义一个AIDL文件
2 实现描述的接口,编写service
3 如果有实体类,需要提供实体类(jar包形式)
客户端
1 拿到AIDL文件
2 绑定服务,获得接口持有对象
核心原理
App启动
2.3总结
3,总结
本次课程基于Android组件对Android有了更深层次的了解,了解了程序的启动以及各组件间的工作方式,大概原理,基本用法。