安卓开发之广播接收器BroadcastReceiver

本文介绍了安卓开发中的广播Broadcast,包括广播的概念、相关API、广播接收器的静态与动态注册,以及一般广播和有序广播的区别。强调了在onReceive中处理耗时操作的注意事项,以及如何使用abortBroadcast()中断有序广播的传播。

一、广播Broadcast

  1. 广播事件处理属于系统级的,可跨应用的事件处理。

  2. 一个应用可以注册对应的广播接收器BroadcastReceiver接收一个/多个广播,也可以发送广播Broadcast

  3. 广播事件机制是应用程序(进程)间通信的一种手段。

  4. 在onReceive中进行耗时操作需要开启分线程来处理,不要在onReceive中直接做耗时处理。

二、相关API

  1. Context

    • sendBroadcast(Intent intent);:发送一般广播
    • sendOrderedBroadcast(Intent intent);:发送有序广播
    • registerReceiver(receiver,intentFilter);:动态注册广播接收器
    • unRegisterReceiver(receiver);:解除广播接收器
  2. BroadcastReceiver

    • onReceive(Context context , Intent intent):接收到广播时的回调。
      //可以从Intent中获取广播所带的数据

    • abortBroadcast():中断广播的继续传播

    • boolean isOrderedBroadcast():判断是否为有序广播
  3. 常见的系统广播http://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html

    (接收某些广播时,需要一定的权限)

    (拦截某些广播时,需要较高的优先级priority来优先接收到广播)

三、广播接收器的两种注册方式

  1. 广播接收器的两种注册方式:静态注册和动态注册。不管注册方式如何,都要写一个广播接收器的子类,并在onReceive中进行接收到相关广播后的事务处理 。

  2. IntentFilter的action中说明监听的广播行为。

    public class MyReceiver extends BroadcastReceiver{
    
            public MyReceiver(){
                Log.e("TAG","MyReceive");
            }
    
            @Override
            public void onReceive(Context context,Intent intent){
    
                Log.e("TAG","onReceive");
            }
    
    
    }       
    
  3. 静态注册:在应用的AnroidManiFest中注册。

    <receiver android:name="广播接收器子类的全类名">
        <intent-filter android:priority="设置广播接收器的优先级(int值)">
            <action android:name="所要接听的广播的action"/> 
        <intent-filter>
    </receiver>
    

    动态注册:使用Java在代码中进行注册。

    //动态注册:
    MyReceiver myReceiver = new MyReceiver();
    //创建过滤器
    IntentFilter filter = new IntentFilter("所要接听的广播的action");
    //注册广播
    registerReceiver(myReceiver,filter)
    
    //解除广播接收器,一般在onDestory中调用
    this.unregisterReceiver(myReceiver);  
    
    
    //动态注册的广播接收器只能为创建它的Activity/Service工作。
    //当动态注册的广播接收器的宿主Activity/Service销毁时,要解除该广播接收器。否则会报错。
    

    动态注册 本地广播接收器(只在应用内传播的广播):LocalBroadcastManager

     LocalBroadcastManager mLocalBroadcastManager;    
     MyReceiver myReceiver;
    
     mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);  
     myReceiver = new MyReceiver();
    
     //创建过滤器
    IntentFilter filter = new IntentFilter("所要接听的广播的action");
    //注册广播接收器
    mLocalBroadcastManager.registerReceiver(mReceiver, filter);     
    
    //解除广播接收器,一般在onDestory中调用
    mLocalBroadcastManager.unregisterReceiver(mReceiver);  
    
  4. 动态注册和静态注册的区别

    静态注册:

    • 注册方法:配置文件

    • 注册时间:应用安装成功/手机开机加载应用完成。注册时不会创建广播接收器对象,接收到广播时才创建。对象执行完onReceive后等待垃圾回收。收到广播后在创建新的对象。

    • 生命结束的时间:应用卸载/对象等待垃圾回收,创建新的对象。

    • 应用场景:需要监听整个应用的整个生命过程/其他应用

    动态注册:

    • 注册方式:Java代码

    • 注册的时间:执行registerReceiver(receiver,filter)后,注册时就创建广播接收器对象。 接收广播时不会再创建对象。

    • 生命结束的时间:执行unRegisterReceiver(receiver)。(注册广播接收器的宿主销毁后必须解除注册,解除注册后,对象等待被回收)

    • 应用场景:只服务于某个Activity/Service

四、一般广播和有序广播

  • sendBroadcast(Intent intent);:发送一般广播

  • sendOrderedBroadcast(Intent intent);:发送有序广播

  • boolean isOrderedBroadcast():判断是否为有序广播(一般广播不可以中断)

  • 区别两种广播:

    这里写图片描述

  • 可以在静态注册/动态注册中指定优先级priority,在广播接收器中调用abortBroadcast()来中断广播的继续传播。(priority最大值为2^31-1)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值