这是我参与「第四届青训营 」笔记创作活动的的第2天
本节课知识点:Android基础组件及通信组件
一、基础组件
包括:界面组件(Activity & Fragment)、服务组件(Service)、广播组件(Broadcast)、数据组件(ContentProvider & ContentResolver)
1 Activity
Activity是用于展示数据,实现与用户的交互的容器。
Activity生命周期:
onCreate():创建时回调,一般在此处创建视图和绑定数据
onStart():已启动,即将进入前台
onResume():与用户开始交互,位于Activity栈顶
onPause():Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
onRestart():重启已停止的Activity,下一个回调是onStart()
onDestory():销毁Actvity,释放该Activity的所有资源
onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
onRestoreInstanceState()/onCreate():用于恢复数据
配置改变场景
1 销毁:Resumed - onSaveInstanceState() - onPause() - onStop() - onDestroy()
2 重建:onCteate() - onStart() - onRestoreInstanceState() - onResume()
配置改变不重建Activity: AndroidManifest中配置Activity节点的configChange属性
local:语言改变
fontScale:字体大小改变orientation:旋转屏幕
keybordHidden:键盘显示隐藏
配置改变:onConfigurationChanged()
Activity启动模式:
Standard:默认模式,允许重复
SingleTask:不允许连续重复
SingleTop:不允许同个栈内重复
SingleInsTance:整个系统不允许重复
小结
2 Fragment
Fragment 表示 FragmentActivity 中的行为或界面的一部分。可以在一个 Activity 中组合多个片段,从而构建多窗格界面;也可以在多个 Activity 中重复使用某个片段。可以将 Fragment 视为 Activity 的模块化组成部分。
Fragment生命周期
onAttach() 在Fragment 和 Activity 建立关联是调用(Activity 传递到此方法内)
onCreateView() 当Fragment 创建视图时调用
onActivityCreated() 在相关联的 Activity 的 onCreate() 方法已返回时调用。
onDestroyView() 当Fragment中的视图被移除时调用
onDetach() 当Fragment 和 Activity 取消关联时调用。
Fragment与Activity交互
组件获取
1 Fragment获取Activity中的组件: getActivity().findViewByld(R.id.xxx)
2 Activity获取Fragment中的组件: getFragmentManager.findFragmentByld(R.id.fragment_xxx)
数据传递
1 Activity传数据给Fragment: setArguments(Bundle bundle)
2 Fragment传数据给Activity:
a通过对象直接传递(方法调用/接口调用)
b通过viewmodel / handler / broadcast / eventbus等通信
小结
Service
基本用法
1注册:AndroidManifest中使用<service.../>标签
2创建:建立相应的Service实现类
3加载:startService() / bindService()
Service生命周期
Service与Activity通信
1 定义Binder子类,并实现getService()方法,返回Service对象
2 实现Service类onBind()方法,返回上述Binder对象
3 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
4 Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
5 Activity既可以通过调用Service实例中的方法进行直接通信
Broadcast
基本用法
静态广播
1 注册:AndroidManifest中使用<receiver../><intent-filter.../>
2 创建:建立相应的BroadcastReceiver实现类
3 接收:在步骤2类onReceive()中接收广播
4 发送:Context.sendBroadcast()
动态广播
注册:Context.registerReceiver()
Broadcast常用系统广播
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
基本用法
生产者
1 注册:AndroidManifest中使用<provider.../>
属性:authorities / exported / readPermission / writePermission
2 创建:建立相应的ContentProvider实现类
方法:onCreate I getType / insert / delete / update / query
消费者
1 声明:AndroidManifest中声明权限
2 使用:context.getContentResolver()
方法:insert / delete / update / query
Intent
基本用法
1 显式lntent
setComponent / setClass指定具体类
2 隐式Intent
Action(动作)
Data(数据)
Category(类别)
Type(数据类型)
Component(组件)
Extra(扩展信息)
Flag(标志位)
Intent系统能力
电话: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"))
地图:Intent(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)
总结
二、通信组件
包括:Handler、Binder
Handler
基本用法
1 创建:新建Handler,实现handleMessage(Message)
2 构造Message: what / setData()
3 发送:子线程调用Handler.sendMessage(Message)发送Message
4 处理:在Handler的handleMessage(Message msg)主线程更新UI
Handler核心原理
Binder
基本用法
服务端\
- 定义一个AIDL文件\
- 实现描述的接口,编写service\
- 如果有实体类,需要提供实体类(jar包形式)
客户端\ - 拿到AIDL文件\
- 绑定服务,获得接口持有对象
Binder核心原理
Binder APP启动
Binder小结