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