BroadcastReceiver详细介绍

1.     生命周期长短的比较:

广播的生命周期是非常短的(通常我们说的10S限制),当发送之后intent会到AndroidManifest.xml文件中找是不是有匹配的action,如果有就会调用Receiver ,然后获得Receiver 对象,再执行重载的onReceive方法,这时候Receiver对象就没有用了,垃圾回收期不定期的回收相应资源,当我们再次点击按钮的时候就会重新获得对象,这就是BroadcastReceiver的生命周期.
  由于以上原因,所以我们在使用BroadcastReceiver的时候,不能在BroadcastReceiver里做一些比较耗时的操作,否侧会弹ANR(Application Not Response)的对话框.这对于android开发绝对是不允许的。

  如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成.这里不能使用子线程来解决,原因主要是: BroadcastReceiver的生命周期很短,子线程可能还没有结束,BroadcastReceiver就先结束了.BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.所以采用子线程来解决是不可靠的.

2.     广播分几种?他们有什么区别?

1.    普通广播:Context.sendBroadcast()

这种广播是无序的,也就是我们只管发出广播,不管接受的先后顺序。就像邮件发送一样,把要邮寄的邮件统一处理,然后全部发出去,不用管接收方的接受顺序。

2.    有序广播: Context.sendOrderedBroadcast()
  
这种广播可以在xml 或者java文件中设计广播的优先级。然后优先级高的首先接受广播,然后优先级高的可以填充数据给后面的广播接收者,同时也可以cancel广播,这样的话,后面的接收者就不能接受广播。这类似于防火墙和窃听器的原理。

 

3,       两种注册BroadcastReceiver的方法?
android
有两种注册广播的方法;一种是在androidmanifext.xml文件中  注册。另一种是在java文件中注册。各有利弊,只能说在了解区别的基础上为我所用。

   区别:

      第一种在XML文件中注册的广播属于常驻行的。也就是说隶属的应用程序关闭的时候,这个广播是依然存在的,可以接收广播消息的。

      第二种在java代码中注册的广播,很好的解决了在xml文件中注册时遇到的问题,就是在程序不需要接收广播的时候,依然没有退出。体现出很好的灵活性,同时也提高了整个手机的资源浪费。

4,       广播发送方和接收方两种的制约:

  1.使用环境:当发送方要求接收方有某种权限的时候,才能接收自己发送的消息。简单的说,就是接收方不仅要有相应的action匹配,还要有接收方申明的权限。使用如下:

     

        /**

        * 发送广播,指定接收者权限

        *sendBroadcast(i, "com.iteye.permission.receiver");//指定接收者权限

        */

       public voidsendBroadcast() {

             //隐式意图,发送广播

             Intent i = new Intent();

             i.setAction("com.iteye.receiver.action");

             i.putExtra("name", "tom");

             this.sendBroadcast(i, " com.iteye.permission.receiver ");

             Log.i("Other",".send ok!");

       }

       在清单文件里receiver必须有这个权限才能收到广播。

       首先,需要定义权限:<permissionandroid:name=" com.iteye.permission.receiver " />

       然后,声明权限:<uses-permissionandroid:name=" com.iteye.permission.receiver " />

       这时接收者就能收到发送的广播。

2.  使用环境:当接收方要求发送方具有某种权限的时候,这样的广播自己才接收。简单的说,就是要给我发广播,不仅要有匹配的action,还要有相应的权限。使用如下:

 

   <!-- 注册广播接收者

              android:permission:控制发送方需要具备指定权限,才接收其广播.

   -->

    <receiver android:name=".MyReceiver"android:permission="com.permission.sender">

              <intent-filterandroid:priority="100">

                    <action android:name="com.iteye.receiver.action" />

                    <category android:name="android.intent.category.DEFAULT" />

              </intent-filter>

     </receiver>

      即使过滤器匹配,如果发送方没有相应权限,接收者也不会接收其广播

 

5. 还有一种广播,叫粘性广播。

  虽然这种广播我们不常用,但是这种广播可以解决BroadcastReceiver生命周期短的限制。比如普通广播在接受到消息10S没有处理结束的时候,系统会终止这样的处理。 而这种广播就是解决这个问题的,它会保存intent一直到消息处理结束。

 

总结:

     以上就是我对广播的粗浅理解,有些功能虽然我们不用,但我们要知道有这个东西,这样等我们遇到相应问题的时候,就可以有解决问题的思路。很快找到解决方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值