BroadcastReceiver
2024-07-27 23:50:25 212人阅读
java.lang.Object |
? | android.content.BroadcastReceiver |
已知直接子类- AppWidgetProvider
- DeviceAdminReceiver,
- WakefulBroadcastReceiver
类概述 基类代码会收到sendbroadcast()意图。 如果你不需要在应用程序发送广播,考虑使用localbroadcastmanager类代替以下描述的更一般的设施。这会给你一个更有效的实现(没有跨进程通信的需要),相关的其它应用程序能够接收或发送你的广播,允许你避免思考任何安全问题。 你可以通过Context.registerReceiver() 动态注册这一类的上下文的一个实例。或静态发布一个<receiver>标签在你的AndroidManifest.xml配置文件。
注意: 如果在Activity.onResume()动态注册一个接收器,你应该在 Activity.onPause() 取消它的活动。(暂停时你不会接受意图,这将减少不必要的系统开销)。不要在Activity.onSaveInstanceState()取消活动。因为这不会被称为是用户在历史堆向后移动。
这里是广播可以接收两大类: 正常广播( Context.sendBroadcast发 送)是完全异步的。所有的广播接收者是运行在一个不确定的顺序,往往在同一时间。这是更有效的,但意味着接收机无法使用的结果或中止API包含在这里。 有序广播(Context.sendOrderedBroadcast发送)被传递到一个接收器在时间。由于每个接收器执行反过来,它可以传播的结果到下一个接收器,或完全放弃广播这样不会被传递到其他的接收机。命令接收器可以与运行在android:priority :匹配的意图过滤器优先级属性;具有相同优先级的接收器将运行在一个任意的顺序
即使在正常广播的情况下,系统可能在某些情况下,恢复一次传送广播接收机。特别是,接收器,可能需要一个创造的过程,只有一个将运行在一个时间来避免超载的系统的新工艺。然而在这种情况下,非顺序的语义,认为:这些接收器还不能返回的结果或中止其广播。请注意,尽管意图类用于发送和接收这些广播,广播机构的意图是从这里的意图是用来启动活动中完全分离 Context.startActivity() 。没有办法让中看到或捕获用于startactivity()意图;同样,当你广播的意图,你将永远找不到或启动活动。这两个操作在语义上是非常不同的:从一个意向活动是一个前台操作,修改什么用户当前交互;广播意图是后台操作,用户通常不知道。 BroadcastReceiver类(启动时作为一个组件通过一个明显的 <receiver> 标签)是一个应用程序的整个生命周期的一个重要组成部分。
涵盖的主题: - Security 保障
接收器使用的Context API本身就是一种跨应用设施,所以你必须考虑其他的应用程序可能滥用他们。一些需要考虑的事情是:- 意图命名空间是全局。确保意图动作名称和其他的字符串写入一个你自己的命名空间中,否则你可能会无意中与其他应用程序发生冲突。
- 你使用registerReceiver(BroadcastReceiver, IntentFilter),任何应用程序可以发送广播接收器,注册。你可以控制谁可以发送广播,它通过权限描述如下。
- 当你发布一个接收器在你的应用程序清单并为其指定的intent过滤器,任何其他的应用程序可以发送广播,它不管你指定的过滤器。要防止其他人发送给它,使它无法使用
android:exported="false" . - 当你使用
sendBroadcast(Intent) 或相关的方法,通常任何其他应用程序可以接收这些广播节目。你可以通过广播接收权限控制谁可以接收。另外,通过ICE_CREAM_SANDWICH ,,你也可以用Intent.setPackage限定广播在一个应用中存在
- 使用
LocalBroadcastManager 时这些问题不存在,因为它从来没有意图去执行当前进程外。 - 访问权限可以通过发送者或接收者广播一个执行。
- 强制许可发送时,你提供非空的权限
sendBroadcast(Intent, String) 或者sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle) 。只有那些被授予此权限接收器(通过请求与 <uses-permission> 标签在AndroidManifest.xml)将能够接收广播。 - 强制接收时,注册广播时候你提供非空权限——要么当调用
registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler) 或者在你的AndroidManifest.xml静态 <receiver> 标签。只有那些已被授予该权限的广播(通过在AndroidManifest.xml的 <uses-permission> 标签。)将能够发送一个意图接收器。 - 看Security and Permissions 文档了解一般的权限和安全性。
- Receiver Lifecycle
- 一个BroadcastReceiver对象只有唯一有效的调用
onReceive(Context, Intent) 。你从这个函数返回的代码,系统考虑该对象完成还是失效。 - 在onReceive(Context, Intent)执行这具有重要的影响:任何需要异步操作是不可用的,因为你将需要从函数返回来处理异步操作,但在这一点上BroadcastReceiver不在活跃,异步操作完成之前这样的系统是免费的删除过程。
- 特别是,你可能不会显示一个对话框或绑定到一个服务于一个BroadcastReceiver。对于前者,你反而应该用NotificationManager API。对于后者,你可以使用Context.startService()将命令发送到服务。
- Process Lifecycle
- 目前正在执行中的boiadcastReceiver这一个过程,(也就是说,目前在
onReceive(Context, Intent) 方法运行)被认为是一个前景的过程,将保持运行的系统除了极端的内存压力的情况下。 - 一旦你返回onreceive(),BroadcastReceiver不再活跃,和其宿主进程只为运行在它的任何其他应用程序组件一样重要。这是特别重要的,因为如果只是举办过程中(的应用程序,用户没有或不最近互动的一个常见的情况),然后在从onreceive()系统还将考虑其过程是空的,积极地杀死它使资源可用于其他更重要的过程。
- 这意味着更长的运行操作,你会经常在一个BroadcastReceiver把含有进程的积极为您的整个操作时间的同时使用一个服务。
开发者指南 了解如何使用这个类来接收和解决的意图,阅读意图和意图过滤器开发者指南。
|
BroadcastReceiver
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。