整理之BroadcaseReceiver

广播的分类

  • 有序广播:按接收器优先级从高到低接受消息,一次只能有一个接收器处理消息。中途可以被截断。
  • 无序广播:所有接收器同时接受消息并处理,无法拦截。
  • 本地广播:只能在本应用内传播的无需广播。上面两种广播可以被其他应用接收到。

静态指定动态注册接收器的广播范围:

<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开始,尽量只使用动态方式注册广播接收器

原文地址:https://www.cnblogs.com/lizhenxin/p/12441401.html