您的位置:首页 > 移动开发 > Android开发

Android_content_BroadcastReceiver

2016-03-23 14:45 375 查看
java.lang.Object
android.content.BroadcastReceiver


Known
Direct Subclasses

AppWidgetProvider, DeviceAdminReceiver, MediaButtonReceiver, RestrictionsReceiver, WakefulBroadcastReceiver


Class Overview

如果你不需要跨应用程序发送广播,可以考虑使用这个类LocalBroadcastManager,而不是下面描述的更一般的设施。这会给你一个更有效的实现(不需要跨进程通信),并让你避免考虑与其他应用程序能够接收或发送广播任何安全问题。


您可以动态注册这个类Context.registerReceiver()或静态的实例,通过发布在AndroidManifest.xml中的<接收>标记的实现。

注意:如果您的Activity.onResume()实现注册一个接收器,就应该注销它Activity.onPause()。 (暂停时您将不会收到意图,这将减少不必要的系统开销)。不要在Activity.onSaveInstanceState()注销,因为如果用户移回在历史堆栈,这将不会被调用。

有可接收广播的两个主要的类:



(与Context.sendBroadcast发送)普通广播是完全异步的。广播的所有接收机都处于未定义顺序运行,通常在同一时间。这是更有效的,但这意味着接收机不能使用的结果,或者中止这里包括的API。
订购广播(与Context.sendOrderedBroadcast发送)是在一个时间传送到一个接收器。由于每个接收器依次执行时,它可以结果传播到下一个接收器,或者它可以完全中止该广播,以便它不会被传递给其他接收机。订单接收运行可以用机器人进行控制:匹配意图过滤器的优先级属性;具有相同优先级的接收器将在一个任意的次序来运行。



即使在正常的广播节目的情况下,该系统可以在某些情况下恢复到一次递送广播一个接收机。特别地,对于可能需要一个过程的创建接收机,只有一个将在同一时间运行,以避免过载系统的新工艺。在这种情况下,然而,非有序语义持有:这些接收器仍然不能返回结果或中止其广播。

需要注意的是,虽然意图类用于发送和接收这些广播,这里的意图的广播机制是从被用于启动与Context.startActivity活动意图完全独立的()。有没有办法为一个BroadcastReceiver看到或与startActivity用于捕获的Intent();同样,当您广播一个Intent,你永远不会找到或启动活动。这两个操作在语义上非常不同的:开始用一意图一个活动是修改什么用户当前使用交互的前台操作;广播的意图是,用户通常不知道一个后台操作。

Topics covered here:

安全
接收器生命周期
流程生命周期

接收器生命周期

一个BroadcastReceiver对象仅适用于调用的onReceive(上下文,意图)的持续时间。一旦你的代码从这个函数返回时,系统会认为要完蛋,不再活跃的对象。

这有可能可以在的onReceive做什么重要的影响(上下文,意图)执行:任何需要异步操作不可用,因为你需要从处理异步操作函数返回,但在这一点上的BroadcastReceiver是不再有效,因此该系统是免费的异步操作完成之前杀死它的进程。
特别是,您可能无法从一个BroadcastReceiver中显示一个对话框或绑定到服务。对于前者,你应该改用NotificationManager API。对于后者,你可以使用Context.startService()将命令发送到服务。

流程生命周期

当前正在执行一个BroadcastReceiver(也就是,当前运行在它的onReceive(上下文代码,意图)方法)进程被认为是一个前台进程,将保留除在极端的内存压力的情况下,由系统运行。

一旦你的onReceive()返回时,广播接收器不再是活动的,它的宿主进程仅仅是作为在它运行的任何其他应用程序组件一样重要。这一点尤其重要,因为如果这个过程只举办广播接收器(对于该用户从未与否最近与互动应用程序的常见情况),那么在从的onReceive()返回系统将审议其过程是空的,积极杀死它使资源可用于其他更重要的进程。

这意味着,对于长时间运行的操作,你会经常一起使用服务与一个BroadcastReceiver来保持包含进程的积极为您的操作的全部时间。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: