美文网首页
Android BroadcastReceiver(广播接收器)

Android BroadcastReceiver(广播接收器)

作者: MacroZH | 来源:发表于2018-05-03 20:39 被阅读0次

    安卓应用程序可以注册广播接收器来接受系统广播(如网络变化、系统启动、电池电量低等都会发出广播),或者接受其他应用程序、甚至自身发出的广播,广播提供了一种跨组件、跨应用、跨进程、跨线程的通信方式。
    安卓中的广播分为两种类型:标准广播和有序广播。
    标准广播:是一种异步广播,广播发出后,所有广播接收器几乎同时接收广播,无法被拦截。
    有序广播:是一种同步执行的广播,广播接收器依次接收广播,可以被拦截。可以设置广播接收器接收的优先级来确定接收广播的先后顺序。

    自定义一个广播接收器MyReceiver ,通过继承BroadcastReceiver,并且重写onReceive方法就可以创建一个简单的广播接收器。

    public class MyReceiver  extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            //这里实现接收广播后的处理逻辑
        }
    }
    

    1 注册广播

    广播接收器由AMS来统一管理
    使用广播接收器需要向AMS进行注册,有两种注册方式:动态注册,静态注册。

    动态注册:调用Context的registerReceiver()方法

    //通过intentFilter来匹配接收的广播
    IntentFilter intentFilter=new IntentFilter();
    //这里标明接收广播的action
    intentFilter.addAction("my_broadcast");
    MyReceiver myReceiver=new MyReceiver();
    registerReceiver(myReceiver,intentFilter);
    
    //取消注册
     unregisterReceiver(myReceiver);
    

    静态注册:在清单文件AndroidManifest中注册广播

            <receiver android:name=".MyReceiver">
    
                <intent-filter>
                    <action android:name="my_broadcast"/>
                </intent-filter>
    
            </receiver>
    

    2 发送广播

    广播发送者通过Binder机制向AMS发送广播,AMS查找符合条件的广播接收器,将广播发送到广播接收器相应的消息循环队列中,消息循环队列拿到广播回调onReceive()方法。

    发送标准广播

     Intent intent1=new Intent();
            intent1.setAction("my_broadcast");
            sendBroadcast(intent1);
    

    发送有序广播

     sendOrderedBroadcast(intent1,null);
    

    拦截广播在onReceiver方法中调用abortBroadcast()方法。这样后面的广播接收器就不会再接收到这条广播。

    //拦截广播 
    public class MyReceiver  extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
                    abortBroadcast();
        }
    }
    
    

    安卓提供一套本地广播,本地广播只能在应用程序内部发送接收,提高了效率也更加安全。
    使用本地广播需要依赖本级广播管理LocalBroadcastManager

      Intent intent2=new Intent();
      intent1.setAction("my_broadcast");
    //获得LocalBroadcastManager实例
    LocalBroadcastManager manager=LocalBroadcastManager.getInstance(MainActivity.this);
    //发送本地广播
    manager.sendBroadcast(intent1);
    

    3 onReceive()方法中的context参数

    对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的:

    1.对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;
    2.对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;
    3.对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。
    4.对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;

    相关文章

      网友评论

          本文标题:Android BroadcastReceiver(广播接收器)

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