1

我遇到了这段代码:

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

在这里阅读有关 AlarmManager的信息时,我不明白他们为什么将他们的接收者声明为启用 = false?他们为什么不希望系统能够实例化他们的接收器,一般来说,在系统无法实例化的 XML 上声明接收器有什么意义?

4

1 回答 1

2

我不明白他们为什么将他们的接收者声明为启用=假?

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

他们为什么不希望系统能够实例化他们的接收者

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

在 XML 上声明一个无法被系统实例化的接收器有什么意义?

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

例如,假设您正在实现下载应用程序之类的东西,它为DownloadManager. 下载文件时,设备可能会重新启动。理想情况下,您希望在重新启动完成后恢复下载。但是,大多数情况下,不会下载文件,因此您通常不需要在启动时获得控制权。

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

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

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

于 2015-10-17T14:15:07.733 回答