我们想知道何时从Android设备上卸载应用程序。我们设置了有关设备应用程序的广播接收器(不在清单中),并在接收到它们时对其进行处理。问题:在卸载应用程序时(使用Android设置->应用程序/通知-> AppYouWantToUninstall->点击垃圾桶),无法接收广播...但是仅在将应用程序安装在Android 10设备上时才会发生。
当然,还有其他两种主要的方法来卸载应用程序:1)点击/按住应用程序,并弹出“应用程序信息”菜单;和2)进入Play商店。其他两种方法提供了ACTION_PACKAGE_REMOVED的广播。
操作系统(Android 7、8、9和10)的所有组合以及三种卸载方法均可提供ACTION_PACKAGE_REMOVED广播,但应用程序在Android 10设备上时,则可以使用“设置”卸载方法。我也会对此表示怀疑,因此我将回答几个可能的调查:“是的,如果我们在Android 10上使用Play Store卸载应用程序,则会获得广播”;“是的,如果我们使用在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)
}
以一种对我们的情况有用的方式来接受接收器的现实状态,该状态将不再起作用(不再可用),所使用的解决方案是:1)在onResume中嵌入一些检查代码,以查看设备的实际情况与应用的实际情况之间是否存在差异对现实的理解;2)使用一种接收器类型(ACTION_PACKAGE_FULLY_REMOVED)至少跟上那些接收器类型(本例中的主要问题)。
要影响新的接收者类型,您必须在清单中注册接收者,如下所示:
<receiver
android:name=".receiver.FullyRemovedBroadcastReceiver">
<!-- <android:exported="true"> -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
其余的内容(广播接收器类的创建):
class FullyRemovedBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || context == null) return
when (intent.action) {
ACTION_PACKAGE_FULLY_REMOVED ->
enqueueWork(context, getIntent(context, ACTION_PACKAGE_FULLY_REMOVED, intent.data?.schemeSpecificPart))
}
}
private fun getIntent(context: Context?, action: String, packageName: String?) =
Intent(context, AppChangeJobIntentService::class.java).apply {
this.action = action
putExtra(EXTRA_PACKAGE_NAME, packageName)
putExtra(EXTRA_DATA_REMOVED, true)
putExtra(EXTRA_REPLACING, false)
}
private fun enqueueWork(context: Context, intent: Intent) {
JobIntentService.enqueueWork(
context,
AppChangeJobIntentService::class.java,
APP_CHANGE_JOB_ID,
intent)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句