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

jac*_*ast 0 android android-intent android-launcher

我正在开发一个启动器应用程序,我刚刚添加了一个广播接收器,我将使用它来更新应用程序列表。我最初尝试接收ACTION_PACKAGE_ADDEDACTION_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)
Run Code Online (Sandbox Code Playgroud)

并体现:

<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>
Run Code Online (Sandbox Code Playgroud)

接收器本身没什么特别的:

class AppsInstallationsReceiver : BroadcastReceiver() {

    override fun onReceive(p0: Context?, p1: Intent?) {
        //TODO
    }
}
Run Code Online (Sandbox Code Playgroud)

事实证明,我只收到PACKAGE_FULLY_REMOVED并且仅当它在清单中注册时才收到。现在这已经足够好了,但我需要一种方法来知道何时安装新应用程序。由于这是一个启动器应用程序,因此此功能至关重要。为什么我没有收到任何东西?当然,该活动仍然存在于后台,因为它被用作启动器。

Mau*_*ani 5

首先,您应该了解Android 8.0 及更高版本引入的隐式广播限制。

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

另一种解决方案是以编程方式注册这些广播——您已经这样做了

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

希望这能解决您的问题。