BroadcastReceiver的注意事项

一.动态注册优于静态注册

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系统及以上,这个广播如果被静态注册,将不再会接受到这条广播,动态注册的可以。 
图片

四.广播机制的底层实现原理

https://www.jianshu.com/p/02085150339c

猜你喜欢

转载自blog.csdn.net/aa642531/article/details/81944657
今日推荐