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

问题描述

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

和清单:

<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")

希望这能解决您的问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...