我遇到了这段代码:
<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/