BroadcastReceiver的注意事项

本文探讨了Android中广播接收器的动态与静态注册的区别及优劣,并提供了动态注册的生命周期管理建议,包括如何处理异常退出情况。同时,还讨论了新版系统对广播机制的影响以及广播机制的底层实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值