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

Whats the point of having a disabled broadcast reciever?

我遇到了这段代码:

<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 为您创建一个进程并完成一系列进程设置工作,最后,您将不会为用户做任何事情。

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

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