一.动态注册优于静态注册
1.静态注册生命周期长于动态注册:
官网开发手册有提到:
太多的BroadcastReceiver会影响手机的性能和电量(原因还没弄明白,估计跟跨进程通信有关),所以应该尽可能地缩短BroadcastReceiver的生命周期,减少我们自身app的电量消耗。
2.动态注册优先级高于静态注册,能降低被拦截的风险。
二.动态注册生命周期管理
1.推荐在Activity的onResume和onPause方法进行register和unregister,简单。即使因为意外情况Activity被干掉,依然能走这两个生命周期方法,保证成对出现和成对调用。
2.如果1的方法导致一些业务需求不能满足(比如卸载应用的广播监听),需要放在Activity的onCreate和onDestroy方法里面,需要注意确保onCreate方法调用之前广播已经反注册。这其中包括正常的Activity退出和意外退出的情况:如果正常退出,最好在退出时finish之前先反注册,避免频繁进入Activity导致广播被多次注册。如果意外退出,可以采用Map这样的键值对数据结构来保存对象的hashcode和注册时用的context,在onSaveInstanceState方法保存对象的hashcode,Activity意外被干掉时,从Bundle对象取出上次对象的hashcode,再把它反注册掉。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
int hashcode = savedInstanceState.getInt(MainActivity.class.getCanonicalName());
unregister(hashcode);
}
register(hashCode(), this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(MainActivity.class.getCanonicalName(), hashCode());
super.onSaveInstanceState(outState);
}
三.新版系统一些注意事项
1.经常被用来监听网络状态的CONNECTIVITY_ACTION,在API 28已经被弃用
在Android7.0系统及以上,这个广播如果被静态注册,将不再会接受到这条广播,动态注册的可以。