gpt4 book ai didi

android - 无法获得ACTION_PACKAGE_REMOVED广播-Android 10/设置

转载 作者:行者123 更新时间:2023-12-02 12:56:17 28 4
gpt4 key购买 nike

我们想知道何时从Android设备上卸载应用程序。我们设置了有关设备应用程序的广播接收器(不在 list 中),并在接收到它们时对其进行处理。问题:在卸载应用程序时(使用Android设置->应用程序/通知-> AppYouWantToUninstall->点击垃圾桶),无法接收广播...但是仅在将应用程序安装在Android 10设备上时才会发生。

当然,还有其他两种主要的方法来卸载应用程序:1)点击/按住应用程序,并弹出“应用程序信息”菜单;和2)进入Play商店。其他两种方法提供了ACTION_PACKAGE_REMOVED的广播。

操作系统的所有组合(Android 7、8、9和10)以及三种卸载方法都会提供ACTION_PACKAGE_REMOVED广播,但当应用程序位于Android 10设备上时,设置卸载方法除外。 我也将对此表示怀疑,所以我将回答几个可能的调查:“是的,如果我们在Android 10上对应用商店使用Play商店卸载,则会收到广播”;“是的,如果我们使用在Android 7、8、9上为某个应用卸载设置后,我们会广播”

该类中的定义:

class AppInstallBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || context == null) return
when (intent.action) {
Intent.ACTION_PACKAGE_ADDED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_ADDED, intent.data?.schemeSpecificPart))
Intent.ACTION_PACKAGE_REPLACED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_REPLACED, intent.data?.schemeSpecificPart))
Intent.ACTION_PACKAGE_CHANGED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_CHANGED, intent.data?.schemeSpecificPart))
Intent.ACTION_PACKAGE_REMOVED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_REMOVED, intent.data?.schemeSpecificPart))
Intent.ACTION_PACKAGE_FULLY_REMOVED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_FULLY_REMOVED, intent.data?.schemeSpecificPart))
}
}

...这就是我们处理收到的 Action 的地方
    private suspend fun processAction(action:String, packageName: String, context: Context) {
when (action) {
ACTION_PACKAGE_ADDED -> updateAppInfo(context, packageName, false)
ACTION_PACKAGE_REPLACED -> updateAppInfo(context, packageName, true)
ACTION_PACKAGE_REMOVED -> deleteAppInfo(context, packageName)
ACTION_PACKAGE_FULLY_REMOVED -> deleteFullyAppInfo(context, packageName)
}
}

这是我们定义(在应用程序中,而不是 list 中)接收方的地方:
    private val installBroadcastReceiver = AppInstallBroadcastReceiver()
private val installReceiverFilter = IntentFilter().apply {
addAction(Intent.ACTION_PACKAGE_ADDED)
addAction(Intent.ACTION_PACKAGE_REMOVED)
addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED)
addAction(Intent.ACTION_PACKAGE_CHANGED)
addAction(Intent.ACTION_PACKAGE_REPLACED)
addDataScheme("package")
}

...以及我们在哪里注册,过滤
    private fun registerAppChanges() {
Timber.d("Registering the installation receiver ..")
registerReceiver(installBroadcastReceiver, installReceiverFilter)
registerReceiver(unlockReceiver, unlockReceiverFilter)
}

最佳答案

要运行Broadcast receiver,您必须知道它是如何工作的。以前,当您注册广播接收器时,即使应用程序不在后台,任何注册的操作发生时也会触发它。然后,Android小组进行了一些更改以优化电池。如果您的应用目标为26或更高,则必须动态声明它而不是 list 。这是文字

Note: If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for implicit broadcasts (broadcasts that do not target your app specifically), except for a few implicit broadcasts that are exempted from that restriction. In most cases, you can use scheduled jobs instead.



那有什么选择呢?您必须使用context或applicationContext动态注册广播。因此,由于您的上下文仍然有效,因此应用会接收广播事件。这是来自Google的文字:

Context-registered receivers receive broadcasts as long as their registering context is valid. For an example, if you register within an Activity context, you receive broadcasts as long as the activity is not destroyed. If you register with the Application context, you receive broadcasts as long as the app is running.



那么,即使您的应用未运行,您如何收听广播事件?

由于广播接收器不可靠,我无法想象任何可行的解决方案,但是您可以一直考虑运行后台服务。这也将是多余的。检查这个答案
Making BroadcastReceiver work in the background in API 26 or above
还有这个来自commonsware
Android O and the Implicit Broadcast Ban

我可以想到的另一个解决方案是,如果API级别低于26,它应该可以正常工作,但对于api 26及更高版本,在您的应用程序onResume中,您将检查每次可用的应用程序和当前应用程序列表。然后删除多余的应用程序。

关于android - 无法获得ACTION_PACKAGE_REMOVED广播-Android 10/设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62112488/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com