【发布时间】:2020-06-05 03:20:13
【问题描述】:
我们想知道应用何时从 Android 设备上卸载。我们设置有关设备应用程序的广播接收器(不在清单中)并在收到时处理它们。问题:卸载应用程序时(使用 Android 设置 -> 应用程序/通知 -> AppYouWantToUninstall -> 点击垃圾箱)未收到广播……但这仅在应用程序安装在 Android 10 设备上时发生。
当然还有另外两种主要的卸载应用方式: 1) 长按应用,调出“应用信息”菜单; 2) 进入 Play 商店。其他两种方法发送 ACTION_PACKAGE_REMOVED 广播。
操作系统(Android 7、8、9 和 10)的所有组合和三种卸载方法都会发送 ACTION_PACKAGE_REMOVED 广播当应用在 Android 10 设备上时,设置卸载方法除外。 I我也会持怀疑态度,所以我会回答几个可能的问题:“是的,如果我们在 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))
}
}
...这是我们处理收到的操作的地方
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)
}
}
这是我们定义(在应用程序中,而不是清单中)接收者的地方:
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)
}
【问题讨论】:
-
如你所见:有一个动作 ACTION_PACKAGE_FULLY_REMOVED ——在我们的测试中,这个广播从未见过——我们认为也许我们错过了那个类型......但事实证明不是就是这样。另外:我们不处理 ACTION_PACKAGE_CHANGED - 不要认为适用于卸载...可能是错误的。
-
能否告诉你是如何注册AppInstallBroadcastReceiver的。它是在清单文件中还是在活动中注册的。
-
@androidcodehunter 是的,我将编辑问题的代码部分并显示我们正在注册活动。
标签: android kotlin broadcastreceiver uninstallation