今天是我参加「第四届青训营」笔记创作活动的第4天。今天上了第二次课,课后对笔记进行整理发布。
认知方法:what、why、how
什么是程序
开发者视角:
-
what:代码+资源
-
why:改变世界
-
how:知识+经验
用户视角
-
what:界面、互动、记忆
-
why:工具、视频、游戏
-
how:应用商店、搜索引擎、官网下载、三方引流
基础组件
开发中常用的组件
界面组件
1.Activity
WHAT:界面容器
WHY:前台交互、程序入口、布局容器
HOW:
基本用法:
注册 -> 布局 -> 绑定
声明在程序清单,写明intent-filter。声明布局文件。与Activity进行绑定。
生命周期:
onCreate():创建时回调,一般在此处创建视图和绑定数据
onStart():已启动,即将进入前台
onResume():与用户开始交互,位于Activity栈顶
onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
onRestart():重启已停止的Activity,下一个回调是onStart()
onDestory():销毁Activity,释放该Activity的所有资源
onSaveInstanceState():在非正常关闭是回调,用于保存数据,不支持持久化数据
onRestoreInstanceState()/onCreate():用于恢复数据
配置改变场景:
1.销毁:Resumed - onSaveInstanceState() - onPause() - onStop() - onDestory()
2.重建:onCreate() - onStart() - onRestoreInstanceState() - onResume()
配置改变不重建Activity:AndroidManifest中配置Activity节点的configChange属性
local:语言改变
fontScale:字体大小改变
orientation:旋转屏幕
keybordHidden:键盘显示隐藏
配置改变(已配置):onConfigurationChanged()
Activity的启动模式(standard)
standard:默认模式,允许重复
singleTop:栈顶复用,不允许连续重复
singleTask:栈内复用,不允许同个栈内同步
singleInstance:全局复用,整个系统不允许重复,单独开辟一个栈,只有这个Activity
举例:
需求-图片浏览器:
1.实现一个图片浏览APP(Activity + Fragment),相册页面 + 大图页面 + 调用相机(Intent)
2.旋转屏幕场景(Activity生命周期)
3.内置升级能力(Service使用)
4.单一首页(SingleTask)
5.相关图片(SingleTop)
6.扫描所有图片(ContentProvider)
7.提供图片选择能力给系统(Intent)
思考:图库APP真的需要每个页面都是Activity吗?
2.Fragment
WHAT & WHY:解决碎片化问题,速度快,。
基本用法:
1.创建Fragment布局文件
2.创建Fragment子类,加载布局文件
3.Activity加载Fragment
3.1静态加载:布局中绑定
3.2动态加载,FragmentManager加载
生命周期:
onAttach():Fragment和Activity建立关联时调用
onCreateView():当Fragment创建视图时调用
onActivityCreated():Activity的onCreate()方法已返回时调用
onDestoryView():当Fragment中的视图被移除时调用
onDetach():Fragment和Activity取消关联时调用
1.启动:onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume() - Resumed
2.退出:Resumed - onPause() - onStop() - onDestoryView() - onDestory() - onDetach()
3.部分遮挡:Resumed - onPause() - Paused
4.部分遮挡恢复:Paused - onResume() - Resumed
5.完全遮挡:Resumed - onPausel() - onStop() - onDestroyView()
6.完全遮挡恢复:onCreateView() - onActivityCreated() - onStart() - onResume() - Resumed
注:Fragment生命周期可通过FragmentTransaction.setMaxLifecycle()手动干预(不常用)
与Activity交互:
-
组件获取:
1.Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx) 2.Avtivity获取Fragment中的组件:getFragmentManager.findFragmentById(R.id.fragment_xxx) -
数据传递:
1.Activity传数据给Fragment:setArguments(Bundle bundle) 2.Fragment传数据给Activity: a.通过对象直接传递(方法调用/接口调用) b.通过viewmodel/handler/broadcast/eventbus等通信
服务组件
Service
WHAT & WHY:服务组件
基本用法:
1.注册:AndroidManifest中使用<servise/>标签
2.创建:建立相应的Service实现类
3.加载:startService()(不交互)/bindService()(有交互)
生命周期:
常用:
1.onStart()
2.onBind()
3.onCreate()
4.onDestory()
与Activity通信:
1.定义Binder子类,并实现getService()方法,返回Service对象
2.实现Service类onBind()方法,返回上述Binder对象
3.实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
4.Activity中调用bindService()方法,并传递步骤3的Service Connection对象,将流程跑起来
5.Activity即可以通过调用Service实例中的方法直接进行通信
广播组件
Broadcast
静态广播:
1.注册:AndroidManifest中使用<receiver.../><intent-filter.../>
2.创建:建立相应的BroadcastReceiver实现类
3.接受:在步骤2类onReceiver()中接收广播
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_BOOT_COMPLETED
Intent.ACTION_PACKAGE_ADDED
Intent.ACTION_PACKAGE_REPLACED
Intent.ACTION_PACKAGE_REMOVED
数据组件
ContentProvider
WHAT & WHY:数据通信
生产者:
1.注册:AndroidManifest中使用<provider.../>
属性:authorities/exportes/readPermission/writePermission
2.创建:建立相应的ContentProvider实现类
方法:onCreate/getType/insert/delete/update/query
消费者:
1.声明:AndroidManifest中声明权限
2.使用:context.getContentResolver()
方法:insert/delete/update/query
Intent
WHAT & WHY:描述需求,请求系统处理
1.Content.startActivity(Intent)
2.Content.startService(Intent)
3.Content.startBroadcast(Intent)
基本用法:
1.显式Intent
setComponent/setClass指定具体类
2.隐式Intent
Action(动作)
Data(数据)
Category(类别)
Type(数据类型)
Component(组件)
Extra(扩展信息)
Flag(标志位)
系统能力:
电话:Intent(ntent.ACTION_DIAL, Uri.parse ("tel:10010"))
短信:Intent(ntent.ACTION_SENDTO, Uri.parse ("smsto:10010"))
网页:Intent(lntent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))
邮件:Intent(Intent.ACTIoN_SENDTO, Uri.parse("'mailto:someone@domain.com”))
地圈:lritent(lntent.ACTION_VIEW, Uri.parse("geo:39.9,116.3"))
拍照:Intent(MediaStore.ACTION IMAGE_CAPTURE)
设置:Intent(android.provider.Settings.ACTION_SETTINGS)
市场:Intent(lntent.ACTiON_VIEW, Uri.parse("market:lldetails?id=" + packageName))
使用:startActivity(intent)
通信组件
用于进程通信等方面
Handler
WHAT & WHY:多线程与主线程间通信
基本用法:
1.新建Handler,实现handleMessage(Message)
2.构建Message:what/setData()
3.发送:子线程调用Handler.sendMessage(Message)发送Message
4.处理:在Handler的handleMessage(Message msg)主线程更新UI
核心原理:
Binder
WHAT & WHY:进程间通信
为什么不用共享内存?Linux的进程隔离:
常用IPC方案对比:
基本用法:
服务端
1.定义一个AIDL文件
2.实现描述的接口,编写service
3.如果有实体类,需要提供实体类(jar包形式)
客户端
1.拿到AIDL文件
2.绑定服务,获得接口对象
核心原理: