这是我参与「第四届青训营 」笔记创作活动的第2天
主要为思维导图大纲,收集课堂要点和一些补充知识
欢迎补充&指正
客户端基础知识必备
1.基础组件
1.1界面组件(Activity&Fragment)
-
Activity
-
what:界面容器
-
why
- 前台交互
- 程序入口
- 布局容器
-
生命周期
- onCreate()创建视图/绑定数据
- onStart()已启动,即将进入前台
- onResume()开始与用户交互,位于Activity栈顶
- onPause()Activity失去焦点或者已经暂停,界面部分可见 下一个生命周期为onStop()或者onResume()
- onStop()Activity不可见,下一个回调是onRestart()或者onDestroy()
- onRestart()重启,下一个回调是onStart()
- onDestroy()销毁Activity并释放其资源
- onSaveInstanceState()非正常关闭时回调,用于保存数据
- onRestoreInstanceState()/onCreate()用于恢复数据
-
配置改变场景
-
1.销毁
- Resume-onSaveInstanceState()-onPause()-onStop()-onDestroy()
-
2.重建
- onCreate()-onStart()-onRestoreInstanceState()-onResume()
-
配置改变
- AndoridManifest配置节点的configChange属性 local:语言 fontScale字体大小 orientation旋转屏幕 keyboardHidden
- onConfiurationChanged()
-
-
启动模式
-
standard(默认:允许重复)
-
singletop(不允许连续重复)栈顶复用
-
singletask(不允许同一个栈重复)栈内复用
- 多个首页
-
singleinstance(不允许整个系统内重复)全局复用
-
-
-
Fragment
-
why
- 界面组件分离
- 速度快
- 解决碎片化问题
-
how
-
1.创建fragment布局文件
-
2.创建fragment子类,加载布局文件
-
3.activity加载fragm
- 3.1静态加载:布局中绑定
- 3.2动态:FragmentManager加载
-
-
生命周期
- onAttrach() activity和fragment建立关联时调用
- onCreateView()创建视图
- onActivityCreated() activity的onCreate()方法时返回调用
- onDestroyView()
- onDectach()取消关联时调用
-
与activity交互
-
组件获取
- getActivity()
- FragmentManager.findFragmentByld()
-
数据传递
-
setArgument()
-
方法调用
-
异步方式
- viewmodel
- handler
- broadcast
-
-
-
1.2服务组件(Service)
-
基本用法
- 1.注册:AndoridManifest中使用<srevice.../>标签
- 2.创建:建立相应Service实现类
- 3.加载:startService()/bindService()
-
生命周期
- onStart()
- onBind()
- onCreate()
- onDestroy()
-
Service与Activity通信
- 1.定义Binder子类,并实现getService()方法,返回Service对象
- 2.实现Service类的onBind()方法,返回上述Binder对象
- 3.实例化ServiceConnection对象,实现onServiceConnected()方法
- 4.Activity中调用bindService()方法,传递步骤3的ServiceConnection对象,将流程跑起来
- 5.Activity可以通过调用Service实例中的方法进行直接通信
1.3广播组件(Broadcast)
-
基本用法
-
静态广播
- 1.注册:AndoridManifest中使用<receive.../><intent-filter.../>
- 2.创建:建立相应地BroadcastReceive实现类
- 3.接收:在步骤二的onReceive()中接收广播
- 4.发送:Context.sendBroadcast()
-
动态广播
- 注册:Context.registerReceive()
-
-
常用系统广播
- 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_PAKAGE_REPLACED
- Intent.ACTION_PAKAGE_REMOVED
1.4数据组件(ContentProvider&ContentResolver)
-
基本用法
-
生产者
-
1.注册:AndoridManifest中使用<provider.../>
- 属性:authorities/exported/readPermission/writePermission
-
2.创建:建立相对应的ContentProvider实现类
- 方法:onCreate/getType/insert/delete/update/query
-
-
消费者
-
1.声明:AndoridManifest中声明权限
-
2.使用:context.getContentResolver()
- 方法:insert/delete/update/query
-
-
1.5Intent
-
意图
- 1.Context.startActivity(Intent)
- 2.Context.startService(Intent)
- 3.Context.sendBroadcast(Intent)
-
基本用法
-
1.显式Intent
- setComponent/setClass指定具体类
-
2.隐式
- Action/Data/Category/Type/Component(组件)/Extra/Flag
-
-
系统能力
- 电话(Intent.ACTION_DIAL,Uri.parse("tel:10010"))
- 短信(Intent.ACTION_SENDTO,Uri.parse("smsto:10010"))
- ...
-
使用:startActivity(Intent)
2.通信组件
2.1Handler
-
基本用法
- 1.创建:新建Handler,实现handlerMessage(Message)
- 2.构造:Message:what、setData()
- 3.发送:子线程调用Handler.sendMessage(Message)发送Message
- 4.处理:在Handler的handlerMessage(Message msg)主线程更新UI
2.2Binder
-
数据copy1次
-
原因:Linux进程隔离
-
基本用法
-
服务端
- 1.定义1个AIDL文件
- 2.实现描述的接口,编写service
- 3.(jar包形式)提供实体类
-
客户端
- 1.拿到AIDL文件
- 2.绑定服务,获得接口持有对象
-
-
核心原理
回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口
1.声明在程序清单AndoridManifest.xml
2.类文件写在MainActivity,默认入口:ui.MainActivity(注册) 3.布局文件:activity.main.xml LinearLayout、Gridview(列表)包装(布局) 4.savedInstanceState(绑定)
接电话被crash
原因:页面被回收导致本地变量被置空
- 1.判空
- 2.页面回收生命周期存储数据,重建时恢复