BroadcastReceiver【翻译】

 

java.lang.Object

  android.content.BroadcastReceiver

直接已知子类:

AppWidgetProvider

public abstract class BroadcastReceiver

extends Object

 

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:

  1. Receiver 生命周期
  2. 授权
  3. 进程生命周期
  4.  

    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()方法返回后,宿主进程就成为空进程,系统极有可能会把宿主进程释放,为其他的进程提供资源空间。

    这就是说,对于耗时比较长的操作,最好放在宿主进程中并使用ServiceBroadcastReceiver 关联,来维持宿主进程在执行期间保持运行。即当接收到广播时,BroadcastReceiver发送一个Service命令,来执行所需的操作。

你可能感兴趣的:(BroadcastReceiver【翻译】)