Android BroadcastReceiver(广播接收器)基础

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

自定义一个广播接收器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中注册广播

        

            
                
            

        

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(广播接收器)基础)