Android常用组件
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启动
总结
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 烟寒乂品!