广播接收器
服务
将接收sendBroadcast()发送的意图的代码的基类。
如果不需要跨应用程序发送广播,请考虑使用这个班有本地广播相反下面描述的更通用的设施。这会给你很多更高效的实施(无需跨进程通信)并允许避免考虑与其他应用程序相关的任何安全问题能够接收或发送您的广播。
本地广播
您可以使用动态注册此类的实例上下文.registerReceiver()或通过<接收器>在您的Android清单.xml.
上下文.registerReceiver()
<接收器>
Android清单.xml
注:如果在您的Activity.onResume()实现,您应该在中注销它Activity.onPause().(暂停时您不会收到意图,这将减少不必要的系统开销)。不要在中注销Activity.onSaveInstanceState(),因为如果用户在历史记录中向后移动,则不会调用此函数堆栈。
Activity.onResume()
Activity.onPause()
Activity.onSaveInstanceState()
可以接收的广播有两大类:
上下文.发送广播
上下文.sendOrdered广播
android:优先级
即使在正常广播的情况下,系统也可能情况恢复为每次发送一个接收器的广播。在特别是,对于可能需要创建进程的接收者,只有一次运行一个,以避免新进程使系统过载。然而,在这种情况下,无序语义仍然有效:这些接收者仍然无法返回结果或中止其广播。
注意,尽管Intent类用于发送和接收这些广播,这里的Intent广播机制是完全独立的从用于启动活动的意图上下文.startActivity().广播接收器是不可能的查看或捕获与startActivity()一起使用的Intent;同样,当如果您广播了一个Intent,您将永远无法找到或启动一个Activity。这两个操作在语义上非常不同:启动带有Intent的Activity是一个前台操作,用于修改用户当前正在与进行交互;广播意图是背景用户通常不知道的操作。
上下文.startActivity()
BroadcastReceiver类(作为组件启动时,通过舱单<接收器>标记)是应用程序的整个生命周期.
此处涵盖的主题:
有关如何使用此类接收和解析意图的信息,请阅读意图和意图过滤器开发人员指南。
与一起使用的接收器上下文API本质上是跨应用程序工具,因此您必须考虑其他应用程序如何可能会滥用它们。需要考虑的事项包括:
上下文
Intent命名空间是全局的。确保Intent操作名称和其他字符串是在您自己的命名空间中编写的,否则您可能会不小心与其他应用程序冲突。
当您使用寄存器接收器(BroadcastReceiver,IntentFilter),任何应用程序可以向该注册接收器发送广播。你可以控制谁可以通过下面描述的权限向其发送广播。
寄存器接收器(BroadcastReceiver,IntentFilter)
当您在应用程序的清单中发布接收方并指定意图过滤,任何其他应用程序都可以向其发送广播指定的筛选器。为了防止他人发送给它他们无法使用android:导出=“false”.
android:导出=“false”
当您使用发送广播(意图)或相关方法,通常,任何其他应用程序都可以接收这些广播。你可以控制谁可以通过下面描述的权限接收此类广播。或者,从开始ICE_CREAM_SANDWICH公司,你还可以使用Intent.set包
发送广播(意图)
ICE_CREAM_SANDWICH公司
Intent.set包
使用时不存在这些问题本地广播,因为意图广播永远不会超出当前进程。
访问权限可以由发送方或接收方强制执行广播节目。
要在发送时强制执行权限,请提供一个非null许可的参数sendBroadcast(意向,字符串)或sendOrderedBroadcast(意向、字符串、BroadcastReceiver、android.os.Handler、int、字符串、捆绑).仅限已被授予此权限的接收者(通过请求<使用权限>标签Android清单.xml)将能够接收广播。
sendBroadcast(意向,字符串)
sendOrderedBroadcast(意向、字符串、BroadcastReceiver、android.os.Handler、int、字符串、捆绑)
<使用权限>
若要在接收时强制执行权限,请提供非null许可在注册您的接收器时--或者在呼叫时registerReceiver(BroadcastReceivers、IntentFilter、String、android.os.Handler)或在静态<接收器>在您的Android清单.xml。只有拥有被授予此权限(通过使用<使用权限>标签Android清单.xml)将能够发送向接收人说明意图。
registerReceiver(BroadcastReceivers、IntentFilter、String、android.os.Handler)
请参阅安全和权限有关权限和一般安全性的更多信息,请参阅文档。
BroadcastReceiver对象仅在调用期间有效到onReceive(上下文、意图)。一旦代码从此函数返回,系统认为对象已完成且不再活动。
onReceive(上下文、意图)
这对您在onReceive(上下文、意图)实现:任何需要异步的东西操作不可用,因为您需要从函数来处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此系统可以自由终止异步操作完成之前的进程。
特别是,您可以不显示对话框或绑定到来自的服务在BroadcastReceiver中。对于前者,您应该使用通知管理器应用程序编程接口。对于后者,您可以使用上下文.startService()到向服务发送命令。
通知管理器
上下文.startService()
当前正在执行BroadcastReceiver的进程(即,当前正在其onReceive(上下文、意图)方法)是被视为前台进程,并将由系统,但在极端内存压力的情况下除外。
从onReceive()返回后,BroadcastReceiver不再活动,并且其托管过程仅与任何其他应用程序一样重要组件。这一点尤其重要,因为如果该进程仅托管BroadcastReceiver(这是一种常见的情况用户从未或最近没有交互过的应用程序),然后从onReceive()返回时,系统将考虑其进程清空并积极杀掉它,以便为其他人提供资源更重要的过程。
这意味着对于长时间运行的操作,您将经常使用一服务与广播接收器共同保持包含进程在整个操作期间处于活动状态。
上下文发送有序广播
setDebugUnregister(布尔值)
对象
等级
wait()
通知()
notifyAll()
设置指示此接收器应中止当前广播;仅适用于通过发送的广播上下文发送有序广播。这将防止阻止任何其他广播接收机接收广播。它仍然会呼叫onReceive(上下文、意图)呼叫方的Broadcast Receiver上下文发送有序广播传入。
此方法不适用于这样的无序广播与发送的内容相同上下文.发送广播
清除指示此接收器应中止电流的标志广播。
返回指示此接收器是否应中止当前广播。
返回给的最后一个值setDebugUnregister(布尔值).
检索前一个接收器设置的当前结果代码。
检索由先前接收器设置的当前结果数据。这通常为空。
检索前一个接收器设置的当前结果额外数据。您对返回的Map所做的任何更改都将传播到下一个接收器。
这可以由中的应用程序调用onReceive(上下文、意图)允许从该功能返回后保持广播活动。这是真的不改变相对的期望响应广播(在10秒内完成),但允许将相关工作转移到另一个线程的实现以避免主UI线程因磁盘IO而出现故障。
广播接收器。未决结果
PendingResult.finish()
如果接收器当前正在处理初始值,则返回true粘性广播的值,即最后一个值广播并当前保存在粘性缓存中,因此这是不是现在广播的直接结果。
如果接收方当前正在处理订单,则返回true广播。
当BroadcastReceiver正在接收Intent时调用此方法广播。在此期间,您可以使用其他方法BroadcastReceiver查看/修改当前结果值。这个方法始终在其进程的主线程内调用,除非您显式要求在不同的线程上使用registerReceiver(BroadcastReceiver、IntentFilter、String、android.os.Handler).当它在主管道上运行时你应该穿线永远不要在其中执行长时间运行的操作(超时为在考虑接收器被阻止,候选人被杀)。无法启动弹出对话框在onReceive()的实现中。
registerReceiver(BroadcastReceiver、IntentFilter、String、android.os.Handler)
如果此BroadcastReceiver是通过<receiver>标记启动的,则该对象从此返回后不再活动功能。这意味着您不应该执行任何异步返回结果,特别是用于交互对于服务,您应该使用startService(意向)而不是bindService(Intent,ServiceConnection,int).如果你愿意要与已经运行的服务交互,可以使用peekService(上下文、意图).
startService(意向)
bindService(Intent,ServiceConnection,int)
peekService(上下文、意图)
中使用的Intent筛选器寄存器接收器(BroadcastReceiver,IntentFilter)在应用程序清单中不保证是独家的。他们向操作系统提示如何找到合适的收件人。它是发件人可以绕过筛选器强制传递给特定收件人分辨率。因此,onReceive()实现应该只响应已知的操作,忽略任何意外的操作他们可能收到的意图。
onReceive()
为已经运行的服务提供活页夹。此方法是同步的如果目标服务不存在,则不会启动该服务,因此它是安全的从呼叫onReceive(上下文、意图).
控制包含不匹配的调试帮助呼叫上下文.registerReceiver().如果使用true调用,则在将其传递给registerReceiver()之前下面的调用堆栈上下文.unregisterReceiver()保留呼叫,稍后打印进行了错误的未注册呼叫。请注意,这样做需要保持应用程序生命周期内有关BroadcastReceiver的信息,导致泄漏——这只应用于调试。
上下文.unregisterReceiver()
对于内部使用,设置此BroadcastReceiver是否以有序模式运行。
更改此广播返回的所有结果数据;只有作品通过发送广播上下文发送有序广播.替换所有当前结果数据根据此方法的给定值。
结果取消(_C)
结果_确定
更改此广播的当前结果代码;仅适用于通过发送的广播上下文发送有序广播。经常使用活动结果_取消和结果_确定常量,尽管该值的实际含义最终取决于广播公司。
结果_取消
setResult(int、String、Bundle)
更改本次广播的当前结果数据;仅适用于通过发送的广播上下文发送有序广播。这是一种武断由广播公司负责解释的字符串。
更改此广播的当前结果附加项;仅适用于通过发送的广播上下文发送有序广播。这是一个捆绑包持有任意数据,其解释取决于广播公司。可以设置为null。完全调用此方法替换当前地图(如果有)。
此方法不适用于这样的无序广播与发送上下文.发送广播