Android之广播接收者(1)

晨曦之光 发布于 2012/05/16 17:05
阅读 1K+
收藏 0

 Android系统的四大组件之:BroadcastReceiver,这种组件本质上就是以后总全局的监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一宗全局的监听器,因此它可以非常方便的实现系统中不同组件之间的通信。例如我们希望客户端程序与startService()方法启动的Service之间的通信,就可以借助于BroadcastReceiver来实现。

BroadcastReceiver简介:

    BroadcastReceiver用于接收程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent,与应用程序启动ActivityService相同的是,程序启动BroadcastReceiver也只需要两步。第一,创建需要启动的BroadcastReceiverIntent。第二,调用ContextsendBroadcast()sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。当应用程序发出一个Broadcast Intent之后,所有匹配该IntentBroadcastReceiver都有可能启动。与ActivityService具有完整的生命周期不同,BroadcastReceiver本质上只是一个系统级的监听器,它专门负责监听各个程序所发出的Broadcast

由于BroadcastReceiver本质上属于一个监听器,因此实现BroadcastReceiver的方法十分简单,只要重写BroadcastReceiveronReceive(Context context ,Intent intent)方法就可以。一旦实现了BroadcastReceiver,接下来就应该指定该BroadcastReceiver能匹配的Intent,此时有两种方法:

1、使用代码进行指定,调用BroadcastReceiverContextregisterReceiver()方法指定。代码如下:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReceiver(receiver, filter);

2、在AndroidManifest.xml文件中配置,代码如下:

<receiver android:name="MySMSListener">

   <intent-filter>

       <action 

android:name="android.provider.Telephony.SMS_RECEIVED"/>

   </intent-filter>

</receiver>

    

Receiver的生命周期

一个BroadcastReceiver的对象仅仅在调用onReceiver(COntext, Intent)的时间中有效。一旦你的代码从这个函数中返回,那么系统就认为这个对象应该结束了,不能再被激活。你在onReceive(Context, Intent)中的实现有着非常重要的影响:任何对于异步操作的请求都是不允许的,因为你可能需要从这个函数中返回去处理异步的操作,但是在那种情况下,BroadcastReceiver将不会再被激活,因此系统就会再异步操作之前杀死这个进程。

特别是,你不应该再一个BroadcastReceiver中显示一个对话框或者绑定一个服务。对于前者(显示一个对话框),你应该用NotificationManagerAPI来替代,对于后者(绑定一个服务),你可以使用Context.startService()发送一个命令给那个服务来实现绑定效果。

权限

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

在发送一个broadcast时强制指定权限,就必须提供一个非空的peemission参数给sendBroadcast(Intent, String)或者是sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handel, int, String, Bundle)。只有那些拥有这些权限(通过在ANdroidManifest.xml文件中相应的声明<uses-permission>标签)receiver能够接收这些broadcast

在接收一个broadcast时强制指定权限,就必须在注册receiver时提供一个非空的permission参数--无论是在调用registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者是通过再AndroidManifest.xml文件中通过<receiver>静态标签来声明。只有那些拥有这些权限(通过在相应的AndroidManifest.xml文件中查询<uses-permission>标签来获知)的发送方将能够给这个receiver发送Intent

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

进程的生命周期

一个正在执行BroadcastReceiver(也就是,正在执行onReceive(COntext, Intent)方法)的进程被认为是一个前台的进程,将会一直运行,除非系统处于内存极度低的情况下。

一旦从OnReceive()方法中返回,这个BroadcastReceiver将不会再被激活,此时它的主进程就和任何其他运行于此应用程序中的组件拥有相同的优先级。这一点非常重要,如果进程仅仅只是拥有BroadReceiver(一个普遍的情况是用户从不或者是最近没有和它进行交互),因此一旦他从onReceive()方法返回时,系统就会认为进程是空的并且主动的杀死它,以便这些资源可以被其它重要的进程利用。

可以接收的broadcast主要分为两种类型
普通的broadcasts(通过Context.sendBroadcast发送)是完全异步的。这个broadcastreceiver以无序的状态运行,经常是在同一时刻运行。这种做法是十分高效的,但是也意味着receiver不能够利用相互处理的结果或者是调用退出的API来退出(因为不知道哪个receiver先接收到intent)

有序的broadcasts(通过Context.sendOrderedBroadcast发送)一次只发送给一个receiver。每一个receiver是有序的处理这个intent的,前面的receiver可以传递结果给下一个receiver,或者任意一个receiver都可以完全的退出,这样intent就不会传递给其他的receivers.receiver的执行顺序可以通过匹配的intent-filter中的android:priority属性来控制;如果有多个receivers处于同一个优先级,那么这几个receivers将会以任意的顺序来执行。

即使是在广播普通的broadcasts的情况下,系统也有可能在某些情况下转换为一次发送一个broadcast给一个receriver。特别是当receivers需要创建进程时,在同一时刻仅仅一个receiver可以运行,避免系统因为这些新建的进程而过载。

注意:

尽管Intent类是用来发送和接受这些broadcasts,这里的Intent broadcast机制和那些通过Context.startActivity()方法来启动activityintent是完全独立的。一个BroadcastReceiver是没办法观察和捕获一个用于启动activityintent的;同样的,当你通过intent来发出broadcast时,你也不可能(通过这个intent)找到或者启动一个activity的。这两种操作是完全不同的:通过一个intent来启动一个activity是一个前台操作,会改变用户当前交互的对象;而通过intent来发出broadcast是一个后台操作,用户经常是察觉不到的。

BroadcastReceiver(通过一个manifest<receiver>标签作为一个组件启动)是应用程序全局声明周期重要的一部分。
  


原文链接:http://blog.csdn.net/xy849288321/article/details/7103567
加载中
返回顶部
顶部