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

乔尔·巴特勒

我们想知道何时从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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

android-如何复制Android 10设置

来自分类Dev

Android:无法设置字幕

来自分类Dev

如何将文件设置为Android 10的铃声?

来自分类Dev

从USB安装Windows 10无法加载设置

来自分类Dev

在 Windows 10 设置中无法识别 SSD

来自分类Dev

android arraylist无法设置对象

来自分类Dev

无法在Android中设置notifyDataSetChanged

来自分类Dev

无法设置android中的样式

来自分类Dev

NullpointerException:无法设置android模块

来自分类Dev

如何获得Android系统偏好设置的外观?

来自分类Dev

无法在Android 9,10 Xamarin上获得Mediaplayer声音

来自分类Dev

无法达到UEFI设置,因为Windows 10无法正确重启

来自分类Dev

使用android:action从设置启动活动

来自分类Dev

RAID 5/10设置

来自分类Dev

无法在Windows 10上设置或删除登录PIN

来自分类Dev

无法在Internet Explorer 10或11中设置选择元素的值

来自分类Dev

Windows 10无法将连接设置为已计量

来自分类Dev

我无法在Windows 10中设置移动热点的带宽

来自分类Dev

Android Studio无法设置特定的语言环境

来自分类Dev

Android:无法在片段中设置TextView值

来自分类Dev

无法在设置中更改Android应用名称

来自分类Dev

Android Studio 1.1.0无法设置Robolectric

来自分类Dev

无法在Android中设置推送通知声音

来自分类Dev

Android测试-无法设置正确的配置

来自分类Dev

Android / Java-无法设置广告尺寸

来自分类Dev

Android应用无法修改系统设置

来自分类Dev

Android Studio“无法保存插件设置”

来自分类Dev

无法从Screen Generator Android Studio导出设置

来自分类Dev

无法在Android中设置推送通知声音