广播的分类
- 有序广播:按接收器优先级从高到低接受消息,一次只能有一个接收器处理消息。中途可以被截断。
- 无序广播:所有接收器同时接受消息并处理,无法拦截。
- 本地广播:只能在本应用内传播的无需广播。上面两种广播可以被其他应用接收到。
静态指定动态注册接收器的广播范围:
<permission
android:name="com.example.permission.MyReceiver"
android:protectionLevel="signature" />
属性值 限定方式
normal 默认值。较低风险的权限,对其他应用,系统和用户来说风险最小。系统在安装应用时会自动批准授予应用该类型的权限,不要求用户明确批准(虽然用户在安装之前总是可以选择查看这些权限)
dangerous 较高风险的权限,请求该类型权限的应用程序会访问用户私有数据或对设备进行控制,从而可能对用户造成负面影响。因为这种类型的许可引入了潜在风险,所以系统可能不会自动将其授予请求的应用。例如,系统可以向用户显示由应用请求的任何危险许可,并且在继续之前需要确认,或者可以采取一些其他方法来避免用户自动允许
signature 只有在请求该权限的应用与声明权限的应用使用相同的证书签名时,系统才会授予权限。如果证书匹配,系统会自动授予权限而不通知用户或要求用户的明确批准
signatureOrSystem 系统仅授予Android系统映像中与声明权限的应用使用相同的证书签名的应用。请避免使用此选项,“signature”级别足以满足大多数需求,“signatureOrSystem”权限用于某些特殊情况
属性值 | 限定方式 |
---|---|
normal | 对其他应用,系统和用户来说风险最小。 |
dangerous | 请求该类型权限的应用程序会访问用户私有数据或对设备进行控制,从而可能对用户造成负面影响。因为这种类型的许可引入了潜在风险,所以系统可能不会自动将其授予请求的应用。 |
signature | 只有在请求该权限的应用与声明权限的应用使用相同的证书签名时,系统才会授予权限。如果证书匹配,系统会自动授予权限而不通知用户或要求用户的明确批准 |
signatureOrSystem | 系统仅授予Android系统映像中与声明权限的应用使用相同的证书签名的应用。请避免使用此选项,“signature”级别足以满足大多数需求,“signatureOrSystem”权限用于某些特殊情况 |
发送广播
//普通广播
val intent = Intent(this, MyReceiver::class.java).apply {
action = "XXX"
intent.setPackage(packageName)
}
sendBroadcast(intent)
//有序广播
sendOrderedBroadcast(intent, null)
//本地广播
val mLocalBroadcastManager = LocalBroadcastManager.getInstance(this)
val filter = IntentFilter("XXX")
mLocalBroadcastManager.registerReceiver(mMyReceiver, filter)
mLocalBroadcastManager.sendBroadcast(intent)
mLocalBroadcastManager.sendBroadcastSync(Intent)
mLocalBroadcastManager.unregisterReceiver(localReceiver) //该变量需要取消注册
接收广播
创建接收器
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { }
}
注册接收器
//方式一:静态注册
<receiver android:name="com.yirong.library.NetStateReceiver">
<intent-filter android:priority="99">
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>
//方式二:动态注册
val intentFilter = IntentFilter("ACTION").apply {
priority = 90
}
val receiver = new MyReceiver();
registerReceiver(receiver, intentFilter);
unregisterReceiver(receiver);
动态接收器:优点灵活,不耗电,易控,省内存 但需要手动注销 适用场景:需要特定时候监听的广播
静态接收器:优点即使应用程序被关闭,也能接收广播。 但耗电,占内存。 适用场景:需要时刻监听的广播
但是 从7.0开始已经对静态注册做出了一些限制(权限),并在8.0使大部分静态注册失效了。
也就是说,从Android7.0开始,尽量只使用动态方式注册广播接收器