问题描述
我正在开发一个启动器应用程序,我刚刚添加了一个广播接收器,我将用它来更新应用程序列表。我最初尝试接收 ACTION_PACKAGE_ADDED
和 ACTION_PACKAGE_REMOVED
,因为它们似乎足以胜任这份工作,但是没有一个被解雇,所以我添加了我认为有用的所有其他与包相关的操作,并尝试在活动中为它们注册:
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED)
intentFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED)
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL)
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED)
val rec = AppsInstallationsReceiver()
registerReceiver(rec,intentFilter)
和清单:
<receiver android:name=".core.installed_apps.AppsInstallationsReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package"/>
</intent-filter>
</receiver>
接收器本身没什么特别的:
class AppsInstallationsReceiver : broadcastReceiver() {
override fun onReceive(p0: Context?,p1: Intent?) {
//Todo
}
}
结果我只收到 PACKAGE_FULLY_REMOVED
并且仅当它在清单中注册时。
现在这已经足够了,但我需要一种方法来知道何时安装了新应用程序。由于这是一个启动器应用程序,因此此功能至关重要。为什么我没有收到任何东西?活动当然还是存在后台的,因为它是作为启动器使用的。
解决方法
首先,您应该了解从 Android 8.0 及更高版本引入的 Implicit Broadcast Limitations。
您注册的广播属于受限广播(ACTION_PACKAGE_FULLY_REMOVED
除外)的类别。因此,当您从清单注册操作时,您将不会收到这些事件。因此,从清单中删除接收者条目。
对此的替代解决方案是以编程方式注册这些广播 - 您已经完成了。
这里唯一缺少的是在注册接收器之前添加 intentFilter.addDataScheme("package")
。
希望这能解决您的问题。