Android:未触发与包相关的意图
Android: package-related intents not fired
我正在开发一个启动器应用程序,我刚刚添加了一个广播接收器,我将使用它来更新应用程序列表。我最初尝试接收 ACTION_PACKAGE_ADDED
和 ACTION_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")
。
希望这能解决您的问题。
我正在开发一个启动器应用程序,我刚刚添加了一个广播接收器,我将使用它来更新应用程序列表。我最初尝试接收 ACTION_PACKAGE_ADDED
和 ACTION_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")
。
希望这能解决您的问题。