Android BroadcastReceiver生命周期分析

来源:互联网 发布:长沙开福网络花店 编辑:程序博客网 时间:2024/06/05 22:50

经常用到BroadcastReceiver,但是每个知识点如果深入研究之后发现多多少少都会发现一些比较模糊的概念。所以在不加班的情况下对某个知识点各个击破。进入正题。


一、BroadcastReceiver的两种注册方式:

(1)动态注册 使用IntentFilter 

MyReceiver myReceiver = new MyReceiver();

IntentFilter intentFilter =new IntentFilter();

intentFilter.addAction("com.test");

registerReceiver(myReceiver,intentFilter);

(2)静态注册在AndroidManifest.xml文件中进行配置:

<receiverandroid:name="com.example.androiddemo.GlobeReceiver">

            <intent-filter>

                <actionandroid:name="com.test"/>

            </intent-filter>

        </receiver>

注:在xml配置的时候会提示警告(暂时以eclipse为例):


网上有解决办法说是将

 <intent-filter>

          <action android:name="com.test" />

  </intent-filter>

这部分代码删掉。结果是没有警告了,但是当你再次发送广播的时候,你将无法收到广播。

还有说法就是讲receiver全部删掉,说是不需要权限,经过验证这种说法也是错误的,也将无法收到广播。

联想动态注册egisterReceiver(receiver, intentFilter);,需要传入一个广播接受者对象以及IntentFilter,如果这里不配置intent-filter是不可能接收到广播的。(个人理解)

最终解决办法就是 增加android:exported="false",这句话的意思就是说不允许其他应用程序进行调用,只能此应用内部就行调用,这个属性四大组件都有,除了特殊需求外,建议设置为false,防止其他外部应用进行调用,保证当前app的安全性。

二、生命周期

1、动态注册方式的BroadcastReceiver,生命周期仅限于当前注册的activity,离开activity一定要解除注册,否则就会抛出非常熟悉的错误,但是这个错误不会导致app崩溃。


即使不会崩溃所以建议还是关闭activity的时候取消注册。问题来了如果我不取消注册BroadcastReceiver会不会继续生效。带着疑问进行了测试,答案是否定的,一旦关闭activity,即使你没有调用unregisterReceiver()方法,你也不会再收到信息。而且还会引发内存泄漏问题。

2、静态注册的BroadcastReceiver,生命周期不仅局限于activity,对比动态注册,进行了测试,发现activity关闭与否,不受影响,即使app退出了还是会收到广播。

那还有一个疑问就是静态注册的时候,谷歌官方并没有提供一些可以取消注册的方法,那该如何取消呢,通过一番研究终于在开发者官网找到了答案


意思就是说如何使通过<receiver>标签进行静态注册receiver,会在执行完onReceive方法后任意时间段内进行销毁,所以我们不用手动进行取消注册操作。详情参照:http://developer.android.com/reference/android/content/BroadcastReceiver.html

三、比较一下两种注册方式的区别

1、动态注册比较灵活,但是生命周期比较短,关闭activity后一定要取消注册。如果没有特殊要求建议动态注册,用完及时取消注册。这样不仅仅能提高程序性能而且在电量优化方面也比较好。


文章中如果有任何不对或不妥的地方,请大家批评指正,共同进步,感谢。

0 0
原创粉丝点击