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