广播
what
android内部封装的一种通信方式,如其名,广播,向注册的接收者广播信息
- 标准广播:异步执行,所有接受器几乎同时收到,无法被拦截
- 有序广播:同步执行,有先后顺序,按照优先级,可以被拦截
接受系统广播
在android系统内部会有巨多的广播,来向向应用扩散重要信息。比如开机,网络,sd卡等等。
想要接受系统广播首先需要定义广播接收器
:
- 静态注册:在Manifest中声明关心的广播
- 动态注册:通过代码声明
定义广播接收器
继承BroadcastReceiver
重写onReceive即可判断广播
1 | class NetworkChangeRecevier extends BroadcastReceiver { |
静态注册
直接在Manifest中书写receiver
标签,同如activity和service,写好intent-filter
1 | //1、新建一个BroadcastReceiver |
动态注册
1 | intentFilter = new IntentFilter(); |
只有注册完之后才能监听广播。
记得在对应的生命周期取消注册。
1 | unregisterReceiver(recevier); |
自定义广播
需要自行传达某些消息
发送标准广播
8.0后自定义广播接受不到解决方案:
- 使用动态注册
- 静态注册,发送广播时携带ComponentName
1 | //1、新建一个自定义的广播接受器 |
发送有序广播
1 | setOrderBroadcast(intent); |
粘性广播
需要额外申请权限在Android系统粘性广播一般用来确保重要的状态改变后的信息被持久保存,并且能随时广播给新的广播接收器使用,使用isInitialStickyBroadcast来判断是否是一个粘性的初始广播值,比如我遇见的耳机插拔的时候就出现的粘性广播。
声明权限
1 | <uses-permission android:name="android.permission.BROADCAST_STICKY" /> |
发送
1 | sendStickyBroadcast(intent);//好像API写了废弃。。 |
判断
1 | isInitialStickyBroadcast() |
本地广播
只在本地应用实行的广播,如果不需要向外部广播,那就用本地广播咯
发送和注册方式略有不同,通过获得LocalBroadcastManager
实例来管理。
1 | localBroadcastManager = LocalBroadcastManager.getInstance(this);//本地广播管理器 |
后续补充
内容提供器
what
在andorid往往需要访问其它应用的数据共同协作。通过内容提供器的方式安全的提供给其他应用访问修改数据。比如读取通讯录,读取MediaCenter的数据,他们都是暴露除了内容提供器来供其它应用访问数据。其它应用通过内容解析器访问uri,如同访问数据库的方式一样访问修改数据。
FileContentProvider
从android 7.0开始直接使用file://Uri
这样暴力的传达文件路径进行分享操作将不可用,会报FileUriExposedException
异常,必须得用content://Uri
这样得形式来解析分享文件的路径
声明FileContentProvider
Manifest中配置
1 | <provider |
路径配置文件
在xml资源文件夹下创键file_paths.xml
1 | //每个节点都支持两个属性:name+path |
使用
1 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { |
经过这样的包装形成uri:content://app的包名/files/path/文件
就可以匹配到具体实际路径了
访问应用数据
android 的许多数据都可以获得,但是要申请权限
比如:通讯录,短信,各种类别的文件
准备uri
api的类一般都会暴露uri,比如:MediaStore.Files.getContentUri("external")
解析
1 | context.getContentResolver().query(); |
就和操作数据库一样,因为内容提供器本身就是相当于包装了一层数据库访问操作。
自定义内容提供器
自然还是要Manifest声明
1 | <provider |
继承实现
感觉是固定代码,内部访问数据库
1 | package com.example.hujie2.filepersistencetest; |