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

  • 相关阅读:
    vue使用Highcharts图表
    Laya 骨骼动画播放
    unity3d学习笔记
    unity学习笔记
    Laya本地存储对象,读取上来之后没有类方法了
    Laya2学习笔记
    Laya vscode f5断点调试开启
    fairyGUI学习笔记
    使用docker安装swoole环境
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/lizhenxin/p/12441401.html
Copyright © 2020-2023  润新知