意图ACTION_PACKAGE_REMOVED被调用,而ACTION_PACKAGE_ADDED不被调用

问题描述

添加删除应用程序时,我正在尝试执行一些代码。我注册了广播接收器,并定义了一个意图过滤器,如下所示:

    mMyReceiver = new MyReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    intentFilter.addDataScheme("package");
    intentFilter.setPriority(999);
    registerReceiver(mMyReceiver,intentFilter);

https://developer.android.com/guide/components/broadcast-exceptions.html中所述,我什至可以在我的AndroidManifest中注册ACTION_PACKAGE_FULLY_REMOVED。好吧,当我卸载应用程序ACTION_PACKAGE_REMOVED以及在清单文件注册的ACTION_PACKAGE_FULLY_REMOVED时,就会调用它。但是,当我安装应用程序时,未调用ACTION_PACKAGE_ADDED。我找不到原因。其他所有与包相关的操作都相同。我唯一可以使用的是与卸载有关的软件。我真的希望其他人对如何解决它有所怀疑。非常感谢!

添加:在另一台设备上,甚至没有调用PACKAGE_REMOVED和PACKAGE_FULLY_REMOVED意图。但是,每20个安装中就有1个触发了ACTION_PACKAGE_ADDED意图。绝对奇怪的行为。是的,用于注册接收者的活动始终在运行,因此广播不会在任何时候取消注册。是不是有某种原因导致这些意图并非总是被人们所唤起,我的意思是像二十次中的一个一样?

加法2:将我的手放在第三台设备上。似乎所有运行android 11的设备(第一台和第三台设备)运行ACTION_PACKAGE_REMOVED和ACTION_PACKAGE_FULLY_REMOVED都没有问题。但是他们从不运行ACTION_PACKAGE_ADDED。但是,第二台设备运行Android10。它从不调用任何REMOVED操作,但会调用20次中的ADDED操作。我不确定100%API版本是否会导致这些不同的行为,但是事情变得越来越棘手。我对任何评论感到高兴!

添加3:越来越疯狂了。另一个Android 10设备运行良好,可以接收所有与PACKAGE相关的强度。这种不一致的行为怎么可能呢?

解决方法

这对我有用。

    var packageAddedReceiver = PackageAddedReceiver()

    val filter = IntentFilter()

    filter.addAction(Intent.ACTION_PACKAGE_ADDED)
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED)
    filter.addAction(Intent.ACTION_PACKAGE_REPLACED)
    filter.addDataScheme("package")
    requireContext().registerReceiver(packageAddedReceiver,filter)

并在清单中

<receiver
        android:name=".receiver.PackageAddedReceiver"
        android:enabled="true"
        android:exported="false">
        <intent-filter android:priority="100">
            <action android:name="android.intent.action.PACKAGE_INSTALL" />
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <action android:name="android.intent.action.PACKAGE_REMOVED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>

我犯的错误是使用 requireContext().registerReceiver(packageAddedReceiver,filter) 注册接收器

LocalBroadcastManager.getInstance(requireActivity())

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...