我遇到了这段代码:
<receiver android:name=".SampleBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
在阅读有关AlarmManager ZipArchive class时,我不明白为什么他们会将他们的接收者声明为enabled = false?为什么他们不希望系统能够实现他们的接收器,并且一般来说什么是声明XML无法通过系统实例化的接收器?
答案 0 :(得分:2)
我不知道为什么他们会将他们的接收者声明为enabled = false?
因为并不总是需要接收器。
为什么他们不希望系统能够实现他们的接收器
因为并不总是需要接收器。
什么是声明XML无法通过系统实例化的接收器?
因为接收器可以在以后需要 时启用。
例如,假设您正在实现类似下载应用程序的内容,这是为DownloadManager
提供实现的内容。下载文件时,设备可能会重新启动。理想情况下,您希望在重新启动完成后恢复下载。但是,大多数情况下,文件没有被下载,因此通常不需要在启动时获得控制权。
懒惰的方法是说你将始终在启动时获得控制权,看看在重启时是否有未完成的下载,如果有,则重启下载,然后去如果没有的话。这很浪费,因为它迫使Android为您分配流程并完成一系列流程设置工作,最后,您不会为用户做任何事情。
更好的方法是正常禁用启动完成的接收器。当下载文件的请求进入时,使用setComponentEnabledSetting()
上的PackageManager
启用接收器,然后在下载完成后再次禁用它。现在,只有在正在进行下载的重新启动时,您才能在启动时获得控制权,并在其余时间加快启动过程。
更一般地说,如果你想从清单注册的接收器监听广播(特别是系统的),但只有部分时间,你可以使用Java代码启用和禁用接收器setComponentEnabledSetting()
。通常,您从接收器被禁用开始,但这不是一个严格的要求。