(1) 为何限制隐式广播:在Manifest里面注册的系统广播接收器会被缓存在系统中,即使当App关闭之后,如果有相应的广播发出,应用程序仍然会被唤醒。比如如果有20个App在Manifest里面注册了ACTION_BOOT_COMPLETED的广播接收器监听设备启动,那么当设备启动时,就会有20个应用程序被唤醒并作出相应的动作。而动态注册的广播则跟随组件的生命周期而消存。因此在Manifest里面注册广播接收器的App越多,设备的性能就越容易受到影响,限制隐式广播主要是为了优化系统性能。
(2) 解决方案
- 优先使用动态注册Receiver的方式,能动态注册绝不使用Manifest静态注册
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.xiaoqiang.try.something.receiver");
TheReceiver receiver = new TheReceiver();
registerReceiver(receiver, intentFilter);
- 如果一定要Manifest静态注册,那么当发送广播的时候,指定广播接收者的包名,即发送显式广播
Intent intent = new Intent("com.xiaoqiang.try.something.receiver");
intent.putExtra("receive","test broadcast");
intent.setPackage(getPackageName());
//intent.setComponent(...)
sendBroadcast(intent);
- 如果要接收系统广播,而对应的广播在Android8.0中无法被接收,那么只能暂时把App的targetSdkVersion改为25或以下。但现在工信部要求targetSdkVersion最小为26(android8.0)
网友评论