2024年6月3日发(作者:)

BroadcastReceiver详解

一.综述

BroadcastReceiver是接收从sendBroadcast()发出的intent的基类。你可以通过

erReceiver()方法在代码中动态的注册一个BroadcastReceiver的实例,也可以通

过再文件中用标签来静态声明。

注意:如果你实在me()方法中注册的一个receiver,那么你必须在

e()方法中进行注销。(当一个activity处于暂停状态是不会接收intents的,并

且这样做也可以减小系统不必要的开销)。不要在InstanceState()方法中注销

receiver,因为activity从栈中恢复的时候并不会调用这个方法了。

可以接收的broadcast主要分为两种类型:

普通的broadcasts(通过oadcast发送)是完全异步的。这个broadcast的receiver

以无序的状态运行,经常是在同一时刻运行。这种做法是十分高效的,但是也意味着receiver

不能够利用相互处理的结果或者是调用退出的API来退出(因为不知道哪个receiver先接收

到intent)。

有序的broadcasts(通过deredBroadcast发送)一次只发送给一个receiver。每一

个receiver是有序的处理这个intent的,前面的receiver可以传递结果给下一个receiver,或

者任意一个receiver都可以完全的退出,这样intent就不会传递给其他的er

的执行顺序可以通过匹配的intent-filter中的android:priority属性来控制;如果有多个

receivers处于同一个优先级,那么这几个receivers将会以任意的顺序来执行。

即使是在广播普通的broadcasts的情况下,系统也有可能在某些情况下转换为一次发送一个

broadcast给一个receriver。特别是当receivers需要创建进程时,在同一时刻仅仅一个receiver

可以运行,避免系统因为这些新建的进程而过载。

注意:尽管Intent类是用来发送和接受这些broadcasts,这里的Intent broadcast机制和那些

通过ctivity()方法来启动activity的intent是完全独立的。一个BroadcastReceiver

是没办法观察和捕获一个用于启动activity的intent的;同样的,当你通过intent来发出

broadcast时,你也不可能(通过这个intent)找到或者启动一个activity的。这两种操作是完全

不同的:通过一个intent来启动一个activity是一个前台操作,会改变用户当前交互的对象;

而通过intent来发出broadcast是一个后台操作,用户经常是察觉不到的。

BroadcastReceiver类(通过一个manifest的标签作为一个组件启动)是应用程序全局

声明周期重要的一部分。

二.Receiver的生命周期

一个BroadcastReceiver的对象仅仅在调用onReceiver(COntext, Intent)的时间中有效。一旦你

的代码从这个函数中返回,那么系统就认为这个对象应该结束了,不能再被激活。

你在onReceive(Context, Intent)中的实现有着非常重要的影响:任何对于异步操作的请求都

是不允许的,因为你可能需要从这个函数中返回去处理异步的操作,但是在那种情况下,

BroadcastReceiver将不会再被激活,因此系统就会再异步操作之前杀死这个进程。

特别是,你不应该再一个BroadcastReceiver中显示一个对话框或者绑定一个服务。对于前者

(显示一个对话框),你应该用NotificationManagerAPI来替代,对于后者(绑定一个服务),你可

以使用ervice()发送一个命令给那个服务来实现绑定效果。

三.权限

存取的权限可以通过在发送方的Intent或者接收方的Intent中强制指定。

在发送一个broadcast时强制指定权限,就必须提供一个非空的peemission参数给

sendBroadcast(Intent, String)或者是sendOrderedBroadcast(Intent, String, BroadcastReceiver,

, int, String, Bundle).只有那些拥有这些权限(通过在文

件中相应的声明标签)的receiver能够接收这些broadcast。

在接收一个broadcast时强制指定权限,就必须在注册receiver时提供一个非空的permission

参数--无论是在调用registerReceiver(BroadcastReceiver, IntentFilter, String, r)

或者是通过再文件中通过静态标签来声明。只有那些拥有这

些权限(通过在相应的文件中查询标签来获知)的发送

方将能够给这个receiver发送Intent。

对于安全和权限的详细内容请查看Security and Permission文档。

四.进程的生命周期

一个正在执行BroadcastReceiver(也就是,正在执行onReceive(COntext, Intent)方法)的进程被

认为是一个前台的进程,将会一直运行,除非系统处于内存极度低的情况下。

一旦从OnReceive()方法中返回,这个BroadcastReceiver将不会再被激活,此时它的主进程

就和任何其他运行于此应用程序中的组件拥有相同的优先级。这一点非常重要,如果进程仅

仅只是拥有BroadReceiver(一个普遍的情况是用户从不或者是最近没有和它进行交互),因此

一旦它从onReceive()方法中返回时,系统就会认为进程是空的并且主动的杀死它,以便这

些资源可以被其他重要的进程利用。

这意味着对于耗时的操作,可以采用将Service和BroadcastReceiver结合使用以确保执行这

个操作的进程在整个执行过程中都保持激活状态。

五.实例详解

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根

据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承astReceiver,

并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者: