广播接收者(BroadcastReceiver)详解

一、简介

  广播是一种传递信息的机制,广播接收者(BroadcastReceiver)可以监听它所感兴趣的广播。每当指定的广播到来时,系统都会重新构造广播接收者对象并调用其onReceive方法,调用完毕后它便会被销毁。广播接收者运行在用户界面(Activity)所在的主线程中,所以onReceive的执行速度越快越好。在执行完毕之前,系统会把它所在的进程当做前台进程,这样只有在极端低内存的情况下它的进程才会被杀死。如果有耗时较长的操作,建议交给后台服务(Service)去做。若未在10秒内从onReceive返回,会导致系统抛出“应用程序无响应(ANR)”的对话框。

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
    }
}

二、订阅广播

1、动态收听(非常驻型。订阅广播与取消订阅必须成对出现,不然会报异常):

// 创建意图过滤器,并添加所要收听的广播名称
IntentFilter IntentFilter = new IntentFilter("广播名称A");  
intentFilter.addAction(Intent.ACTION_广播名称B);

/** * 设置意图过滤器的优先级为某个值。 * 默认值为0,取值范围[-1000, 1000],越大越优先。 * 优先级高的接收者会先接收到有序广播(详见下文),并且能设置/获取处理结果信息或者干脆中止广播。 * 如果优先级相同,则订阅得越早越优先 */
intentFilter.setPriority(某个值);

MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver(); 

// 订阅广播
(Context.)registerReceiver(myBroadcastReceiver, intentFilter);

// 取消订阅
(Context.)unregisterReceiver(myBroadcastReceiver);

2、静态收听(常驻型。只要应用进程还存活着,就能接收到广播):

在AndroidManifest.xml文件中的<application>节点里定义:
<!-- 设置本接收者的类名,以及是否接收其他应用的广播 -->
<receiver android:name=".MyBroadcastReceiver" android:exported="false"> 

   <!-- 设置本接收者的优先级为某个值 -->
   <intent-filter android:priority="某个值">
        <action android:name="广播名称"/>  
   </intent-filter>  

</receiver>  

三、发送广播

/** * 创建一个意图内容对象。广播的所有信息都放在它里面。 * 广播名称可以用系统定义好的,也可以自定义 */
Intent intent = new Intent("广播名称");

/** * 往意图内容中添加信息 * 本方法有多种重载版本,参数一般都有键值对(key、value) */
intent.putExtras(广播信息);

// 指定发送到某个应用
intent.setPackage("某个应用的包名");

// 可以发送无序广播,所有订阅了该广播的接收者都能接收到
(Context.)sendBroadcast(intent);

/** * 也可以发送有序广播,优先级高的接收者会先接收到。 * 广播接收者的权限(在AndroidManifest.xml文件中的uses-permission)。 * 可自定义权限;为null表示不要求权限 */
(Context.)sendOrderedBroadcast(intent, "广播接收者的权限");

四、接收广播

// 确认是否有序广播
(BroadcastReceiver.)isOrderedBroadcast();

// 获取意图内容里的数据
(Intent.)getXXXX(key /* 根据key获取对应的value */);

// 若是有序广播,则可以设置/获取往后传递的三种处理结果(即Result)信息:
(BroadcastReceiver.)setResultCode(结果值);
(BroadcastReceiver.)setResultData("结果数据");
(BroadcastReceiver.)setResultExtras(广播信息 /* Bundle类型 */);
(BroadcastReceiver.)setResult(结果值, "结果数据", 广播信息 /* Bundle类型 */);
(BroadcastReceiver.)getResultCode();
(BroadcastReceiver.)getResultData();
// 如果参数为false,则返回的Map有可能为null,要做好判断
(BroadcastReceiver.)getResultExtras(true);

// 若是有序广播,则当前接收者也可以中止广播,不往后传递
(BroadcastReceiver.)abortBroadcast();

五、本地广播管理者
默认的广播名称(ACTION)是全局性的,其他应用有可能会参与到发送接收的过程中,这就带来了一些安全隐患。如果只是在进程里进行广播,可以考虑用本地广播管理者(LocalBroadcastManager)来发送广播。由于没有跨进程通信,因此它的效率更高,而且十分安全。

// 获取本地广播管理者的实例
LocalBroadcastManager localBroadcastManager =
    LocalBroadcastManager.getInstance(context);

// 订阅本地广播
localBroadcastManager.registerReceiver(myBroadcastReceiver, intentFilter);

// 取消订阅本地广播
localBroadcastManager.unregisterReceiver(myBroadcastReceiver, intentFilter);

// 发送本地广播。只能发送无序广播,不能发送有序广播
localBroadcastManager.sendBroadcast(intent);

你可能感兴趣的:(intent,Broadcast,receiver)