Android之BroadcastReceive

作者: 哇楼主 | 来源:发表于2016-09-24 16:37 被阅读184次

简单介绍:Android四大组件之一,本质上是一个全局的监听器,用来监听全局的广播信息,可以方便的实现系统的不同组件的通信。
流程分析
首先要明确发送的信息,然后明确发送广播的地方,把过滤的信息和发送的信息都放入到intent的对象中,然后调用sendBroadcast方法,发送广播。
当广播发送出去后,已经注册的广播接受者就会检测自己的过滤信息,看是否符合条件,如果符合条件就接收信息,不符合就不接受。
定义:广播接收者可以接收某个频道(action)发来的广播,发送者可以是activity也可以是service
作用:

  • 监听系统的广播,并且可以作出相应的处理
  • 后台运行的服务在完成耗时操作后,比如网络下载文件,获取数据成功后,会通知activity更新

用法

  • 创建一个类,让这个类继承BroadCastReceiver

  • 必须重写onReceive(Context context,Intent intent)方法

  • 注册广播

  • 静态注册:在清单文件中注册(全局)
    <receiver android:name="全类名">

    <intent-fileter>

    <action android:name=""/>
    </intent-fileter>
    </receiver>

  • 动态注册

     IntentFilter filter = new IntentFilter();
     filter.setAction("");
     context.registerReceiver(receiver,filter);
    
  • 两者的区别:
    当使用静态注册广播时,不管程序是否开启,否能够接受发送来的广播,静态注册每次有消息都会由系统new一个处理器,进行处理,然后销毁。
    动态注册会比静态注册更加灵活,动态注册的广播如果没有执行unregisterReceiver方法去取消注册,合静态注册就差不多了,动态生成的广播接受者必须调用代码去销毁,每次处理消息也会生成新的处理器

广播的分类

  • 普通广播 :依次传递给各个接受者去处理:
    发送广播的步骤:
    Intent intent = new Intent();
    intent.setAction("消息的描述");
    // intent.putString("","");
    context.sendBroadcast(intent);

  • 有序广播:这种广播的处理顺序是按照广播接受者的优先级进行排序的,高优先级就会优先接受到这条广播。
    一般发送这种广播,高优先级的接受器会先接收到并且拦截广播,那么低优先级的接收者就接受不到了。

  • 粘性广播:发送之后会一致存在于系统的消息容器当中,直到处理他的接受这出现为止。(api21过时)
    发送粘性广播需要权限: BROADCAST_STICKY
    发送粘性广播的方法: sendStickyBroadcast (Intent intent)
    关于广播的注意事项

  • 广播接受者的生命周期是非常短暂的,在接收到广播时被创建,在onReceive方法结束之后被销毁。

  • 广播接收者中不要做耗时操作,等待时间超过10秒就会弹出Application Not Responding的错误对话框。

  • 最好也不要在广播接收者中创建子线程,然后在子线程中做耗时操作,因为在广播接收者被销毁之后,就拿不到这个线程的引用了,那么子线程就会编程空线程,很容易会被系统杀死。

  • 耗时操作在服务当中完成。

相关文章

网友评论

    本文标题:Android之BroadcastReceive

    本文链接:https://www.haomeiwen.com/subject/sppxyttx.html