关于8.0通知的那些事

广播限制(官方解释)

如果应用注册为接收广播,则在每次发送广播时,应用的接收器都会消耗资源。 如果多个应用注册为接收基于系统事件的广播,则会引发问题:触发广播的系统事件会导致所有应用快速地连续消耗资源,从而降低用户体验。 为了缓解这一问题,Android 7.0(API 级别 24)对广播施加了一些限制,如后台优化中所述。 Android 8.0(API 级别 26)让这些限制更为严格。

  • 适配 Android 8.0 或更高版本的应用无法继续在其清单中为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用的广播。 例如,ACTION_PACKAGE_REPLACED 就是一种隐式广播,因为该广播将被发送给所有已注册侦听器,让后者知道设备上的某些软件包已被替换。 不过,ACTION_MY_PACKAGE_REPLACED 不是隐式广播,因为不管已为该广播注册侦听器的其他应用有多少,它都会只被发送给软件包已被替换的应用。
  • 应用可以继续在它们的清单中注册显式广播。
  • 应用可以在运行时使用 Context.registerReceiver() 为任意广播(不管是隐式还是显式)注册接收器。
  • 需要签名权限的广播不受此限制所限,因为这些广播只会发送到使用相同证书签名的应用,而不是发送到设备上的所有应用。

PS:1、8.0以及以上版本,自定义广播静态注册时,不可隐式启动广播,可采用显示启动广播的方式,即指定包名和路径:

 

         Intent intent = new Intent("com.example.boardreceiver1.broadcast1");//这一步可以分解为下面两步

         intent.setComponent(new ComponentName("com.example.boardreceiver1","com.example.boardreceiver1.MyReceiver"));

         // 上面这一行在Android 7.0及以下版本不是必须的,但是Android 8.0或者更高版本,发送广播的条件更加严苛,必须添加这一行内容。 // 创建的ComponentName实例化对象有两个参数,第1个参数是指                     接收广播类的包名,第2个参数是指接收广播类的完整类名。 sendBroadcast(intent,null);

       2、8.0以及以上版本,自定义广播动态注册时,可采用显示,隐式的方式来启动

       3、从8.0版本开始,取消了大部分的系统静态注册的广播,比如网络变化的系统广播等;但是有些系统广播还是保留了静态注册的方式,比如开机启动的广播

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值