java.lang.Object java
android.content.BroadcastReceiver android
直接已知子类: 异步
public abstract class BroadcastReceiver spa
extends Object orm
BroadCast基类能够接收sendBroadcast()方法发送的intent信息。BroadcastReceiver类能够在Java代码中经过Context.registerReceiver()方法动态注册,也能够在Manifest文件中声明。 对象
注意: 生命周期
若是在Activity.onResume()方法中注册receiver类,那么须要在Activity.onPause()方法中释放它(在进入paused状态以后,就不须要再接收广播了,这样就能够减小系统开销),不要在Activity.onSaveInstanceState()方法中注销receiver类,由于当Activity转向后台,这个方法就再也不被使用。 进程
Receiver类能够接收的广播主要分两种: 资源
1)普通广播:用方法Context.sendBroadcast发送,接收到这中广播的receiver类对象,不分前后顺序,几乎同时对广播作出反应。这种方式更高效,但同时意味着receiver类不能使用其余receiver类处理的结果,也没法终止广播的传送。
2)有序广播:用方法Context.sendOrderedBroadcast发送,这种广播每次只发送给一个receiver类,当轮到一个receiver类执行的时候,它能够向下一个接收的receiver类传送处理结果数据,也能够终止广播的传送,广播再也不被其余的receiver类接收。Receiver类的执行顺序用能够用intent-filter中配置android:priority属性来控制,属性值越高,优先级越高,接收广播顺序越靠前。同一优先级的receiver类的接收顺序是任意的。
即便普通的广播,在某些状况下系统也是一次只传送给一个receiver类。例如,有一些receiver类须要建立新的进程,这是每次只能执行一个receiver类,从而避免系统过载,可是,这些状况下,receiver类之间依然不能传递结果数据,也不能终止广播的传送。
注意,虽然Intent类用来发送和接收广播,当时Intent广播机制下的Intent类与Context.startActivity()启动Activity类时的Intent类是彻底区别开的,BroadcastReceiver是不能看到Context.startActivity()发送的Intent类对象的;一样的,当使用Intent类发送广播时,也不会有Activity被启动。
BroadcastReceiver类 (在做为一种组件在Manifest中加载时)是应用程序进程周期的重要部分。Topics covered here:
Receiver 生命周期
一个BroadcastReceiver 对象只在调用onReceive(android.content.Context, android.content.Intent)方法时有效。一旦这个方法返回,系统就会终止这个对象。 这一点对于如何实现onReceive(android.content.Context, android.content.Intent)方法很是重要:任何异步操做都是不容许的,由于异步操做须要在onReceive(android.content.Context, android.content.Intent)返回后本身去作一些处理,但此时,BroadcastReceiver对象已经不存在了,因此这时系统随时能够在异步操做本身完成以前释放它。
另外,也不能够在BroadcastReceiver 对象中打开对话窗口,或者启动Service。对于前者,能够调用NotificationManager API,对于后者,可使用Context.startService()向service发送命令。
受权
受权能够在Intent对象发送方也能够在接收方指定。
在发送方指定受权,必须为Context.sendBroadcast(Intent, String)方法或者Context.sendBroadcast(Intent, String) or Context.sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)方法提供一个非空的String类型的受权说明。只有拥有一样受权说明(在Manifest文件中用<uses-permission>标签指定)的receiver类才能够接收这个广播。
在接收方指定受权,必须为Context.registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)方法提供一个非空的String类型的受权说明或者在Manifest文件中经过<uses-permission> 元素声明。只有拥有一样受权的broadcasters发送者才能够向这个receiver类发送广播。
进程生命周期
正在执行BroadcastReceiver 的进程(即正在执行onReceive(android.content.Context, android.content.Intent)方法的进程)是系统正在前台执行的进程,除非空间极度紧张的状况,系统会保持运行这个进程。
一旦从onReceive()方法返回,BroadcastReceiver 就再也不可用,它的宿主进程也就和运行在它里面的应用组件处在同等优先地位。特别的,当宿主进程只有一个子进程时,在onReceive()方法返回后,宿主进程就成为空进程,系统极有可能会把宿主进程释放,为其余的进程提供资源空间。
这就是说,对于耗时比较长的操做,最好放在宿主进程中并使用Service与BroadcastReceiver 关联,来维持宿主进程在执行期间保持运行。即当接收到广播时,BroadcastReceiver发送一个Service命令,来执行所需的操做。