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).只有那些拥有这些权限(通过在文
件中相应的声明
在接收一个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广播接收者:


发布评论