这是我参与「第四届青训营」笔记创作活动的第2天
Android常用组件
前言
认知方法
- what
- why
- how
什么是程序
-
what
- 代码 + 资源
-
why
- 改变世界
-
how
- 知识 + 经验
用户视角
-
what
- 界面
- 互动
- 记忆
-
why
- 工具
- 视频
- 游戏
-
how
- 应用商店
- 搜索引擎
- 官网下载
- 三方引流
基础组件
需求
需求-图片浏览器
- 实现一个图片浏览APP(Activity + Fragment)
- 相册页面 + 大图页面 + 调用相机 (Intent)
- 旋转屏幕场景 (Activity生命周期)
- 内置升级功能(Service使用)
- 单一首页(SingleTask)
- 相关照片(SingleTop)
- 扫描所有照片(ContentProvider)
- 提供照片选择能力给系统(Intent)
界面组件
-
Activity
-
what
-
why
-
how
- 基本用法
-
生命周期
- onCreate():创建时回调,一般在此创建视图和绑定数据
- onStart():已启动,即将进入前台
- onResume():与用户开始交互,位于Activity栈顶
- onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
- onStop():Activity不再可见,下一个回调是onRestart()或onStart()
- onDestory():销毁Activity,释放该Activity的所有资源
- onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
- onRestoreInstanceState()/onCreate():用于恢复数据
-
-
-
-
生命周期小结
-
启动模式
- standard:默认模式,允许重复
- singleTop:不允许连续重复
- singleTask:不允许同个栈内重复
- singleInstance:整个系统不允许重复
- 启动模式总结
- standard:默认模式,允许重复
-
-
Fragment
-
特点:
- 碎片化
- 速度快
-
基本用法
-
创建Fragment布局文件
-
创建Fragment子类,加载布局文件
-
Activity加载Fragment
- 静态加载:布局中绑定
- 动态加载:FragmentManager加载
-
-
生命周期
- onAttach():Fragment和Activity建立关联时调用
- onCreateView():当Fragment创建视图时调用
- onActivityCreated():Activity的onCreate()方法已返回调用
- onDestroyView():当Fragment中的视图被移除时调用
- onDetach():Fragment和Activity取消关联时调用
-
与Activity交互
-
组件获取
- Fragment获取Activity中的组件:getActivity().findViewById(R.id.xxx)
- Activity获取Fragment中的组件:getFragmentManager.findFragmentById(R.id.fragment_xxx)
-
数据传递
-
Activity传数据给Fragment: setArguments(Bundle bundle)
-
Fragment传递数据给Activity:
- 通过对象直接传递(方法调用/接口调用)
- 通过viewmodel/handler/broadcast/eventbus等通信
-
-
-
Fragment总结
-
服务组件
-
Service
-
基本用法
- 注册:AndroidManifest中使用<service.../>标签
- 创建:建立相应的Service实现类
- 加载:startService() / bindService()
-
生命周期
- onStart()
- onBind()
- onCreate()
- onDestroy()
-
与Activity通信
- 定义Binder子类,并实现getService()方法,返回Service对象
- 实现Service类onBind()方法,返回上述Binder对象
- 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取Service实例
- Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
- Activity既可以通过调用Service实例中的方法进行直接通信
-
广播组件
-
BroadCast
-
基本用法
-
静态广播
- 注册:AndroidManifest中使用<receiver.../><intent-filter.../>
- 创建:建立相应的BroadcastReceiver实现类
- 接收:在步骤2类onReceive()中接收广播
- 发送:Context.sengBroadcast()
-
动态广播
- 注册:Context.registerReceiver()
-
-
常用系统广播
-
数据组件
-
ContentProvider
-
基本用法
-
生产者
-
注册:AndroidManifest中使用<provider.../>
属性:authorities/exported/readPermission/writePermission
-
创建:建立相应的ContentProvider实现类
方法:onCreate/getType/inset/delete/udate/query
-
-
消费者
-
声明:AndroidManifest中声明权限
-
使用:context。getContentResolver()
方法:insert/delete/update/query
-
-
-
意图组件
-
Intent
- Context.startActivity(Intent)
- Context.startService(Intent)
- Context.sendBroadcast(Intent)
-
基本用法
-
显式Intent
setComponent / setClass指定具体类
-
隐式Intent
Action(动作) Data(数据) Category(类别) Type(数据类型) Component(组件) Extra(扩展信息) Flag(标志位)
-
-
系统能力
Android通信组件
-
Handler
-
基本用法
- 创建:新建Handler,实现handleMessage(Message)
- 构造Message:what / setData()
- 发送:子线程调用Handler.setMessage(Message)发送Message
- 处理:在Handler的handleMessage(Message msg)主线程更新UI
-
核心原理
-
-
Binder
-
常用IPC方案对比
-
为什么不用共享内存
-
基本用法
-
服务端
- 定义一个AIDL文件
- 实现描述的接口,编写service
- 如果有实体类,则需要提供实体类(jar包形式)
-
客户端
- 拿到AIDL文件
- 绑定服务,获得接口持有对象
-
-
核心原理
-
App启动
-