Android:未触发与包相关的意图

Android: package-related intents not fired

我正在开发一个启动器应用程序,我刚刚添加了一个广播接收器,我将使用它来更新应用程序列表。我最初尝试接收 ACTION_PACKAGE_ADDEDACTION_PACKAGE_REMOVED,因为它们似乎足以胜任这项工作,但是 none 被解雇了,所以我添加了我认为有用的所有其他与包相关的操作,并尝试为它们注册都在 activity:

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 并且只有在清单中注册了它。 现在这已经足够了,但我需要一种方法来知道何时安装了新应用程序。由于这是一个启动器应用程序,因此此功能至关重要。为什么我没有收到任何东西? activity 当然仍然存在背景,因为它被用作启动器。

首先,您应该了解 Android 8.0 及更高版本引入的 Implicit Broadcast Limitations

您注册的广播属于受限广播类别(ACTION_PACKAGE_FULLY_REMOVED除外)。因此,当您从清单中注册操作时,您不会收到这些事件。因此,从清单中删除接收器条目。

另一种解决方案是以编程方式注册这些广播 - 您已经完成了.

这里唯一缺少的是在注册接收器之前添加intentFilter.addDataScheme("package")

希望这能解决您的问题。