android - 禁用广播接收器有什么意义?

标签 android broadcastreceiver android-broadcast android-broadcastreceiver

我遇到了这段代码:

<receiver android:name=".SampleBootReceiver"
        android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

在阅读 AlarmManager here 时,我不明白为什么他们会声明他们的接收器为enabled=false?为什么他们不希望系统能够实例化他们的接收器?一般来说,在 XML 上声明无法由系统实例化的接收器有什么意义?

最佳答案

i dont get why would they declare their reciever as enabled=false?

因为接收器并不总是需要的。

why wouldnt they want the system to be able to instiantiate their reciever

因为接收器并不总是需要的。

whats the point of declaring a reciever on XML that can not be instantiated by the system?

因为接收器可以在稍后需要时启用。

例如,假设您正在实现类似“下载”应用程序的应用程序,它提供了 DownloadManager 的实现。下载文件时,设备可能会重新启动。理想情况下,您希望在重新启动完成后继续下载。但是,大多数时候,文件不会被下载,因此您通常不需要在启动时获得控制权。

懒惰的方法是说您将总是在启动时获得控制权,查看重新启动时是否有未完成的下载,如果有则重新启动下载,然后继续如果没有就离开。这是浪费的,因为它迫使 Android 为你 fork 一个进程并完成一系列进程设置工作,最终你不会为用户做任何事情。

更好的方法是正常禁用启动完成的接收器。当收到下载文件的请求时,使用 PackageManager 上的 setComponentEnabledSetting() 启用接收器,然后在下载完成后再次禁用它。现在,只有在有正在进行的下载的重新启动时,您才能在启动时获得控制权,从而加快其余时间的启动过程。

更一般地说,如果您想从 list 注册的接收器监听广播(特别是系统广播),但只是在某些时候,您可以使用 Java 代码启用和禁用接收器setComponentEnabledSetting()。通常,您首先会禁用接收器,但这不是严格要求。

关于android - 禁用广播接收器有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187546/

相关文章:

android - SQLite 中存储的图像未显示在 Gridview 中

android - 如何在onTouch 中改变图像的颜色?

java - 奇怪的 AlarmManager 行为

android - 在特定日期和时间显示通知

android - BroadcastReceiver 的动态注册与静态注册

android - 用于 WALLPAPER_CHANGED 的 BroadcastReceiver 多次调用 onReceive() : Android

php - 保存图像异步 CodeIgniter PHP

android - 如何为 google map api v2 设置默认位置和缩放级别?

android - 如何检查 Receiver 是否在 Android 中注册?

android - 如何知道一天在android中何时开始?