Android Intent.ACTION\u包\u已更改-未收到应用程序组件禁用的广播

Android Intent.ACTION\u包\u已更改-未收到应用程序组件禁用的广播,android,android-intent,android-launcher,android-package-managers,Android,Android Intent,Android Launcher,Android Package Managers,我正在为android开发一个launcher应用程序,为此,我需要我的应用程序收到系统广播的通知,包括删除、更改等影响用户可用启动活动的操作(由我的应用程序显示) 已安装包的广播,已删除包,程序包更新和程序包禁用/启用正常工作,但问题是当整个程序包被禁用时,如通过Tianium backup或某些类似的应用程序,其通过调用具有操作意图的系统广播通知我的广播接收器。操作\u程序包\u已更改,但当应用程序组件(如活动)被禁用时从MyAndroidTools等应用程序单独发送时,不会向我的广播接收器

我正在为android开发一个launcher应用程序,为此,我需要我的应用程序收到系统广播的通知,包括删除、更改等影响用户可用启动活动的操作(由我的应用程序显示)

已安装包的广播,已删除包,程序包更新和程序包禁用/启用正常工作,但问题是当整个程序包被禁用时,如通过Tianium backup或某些类似的应用程序,其通过调用具有操作意图的系统广播通知我的广播接收器。操作\u程序包\u已更改,但当应用程序组件(如活动)被禁用时从MyAndroidTools等应用程序单独发送时,不会向我的广播接收器发送通知,即由于禁用单个应用程序组件,不会从系统接收到我的应用程序的广播(有目的的广播。操作\u包\u已更改)

这是我的广播接收者清单声明,带有必要的意图过滤器:

<receiver android:name=".LauncherBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_CHANGED"/>
                <action android:name="android.intent.action.PACKAGE_REPLACED"/>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>

一切都按预期工作,但只有当整个包被禁用或启用时,而不是当单个组件(如活动)被禁用或启用时

确实有办法做到这一点,因为我已经用其他一些启动器对其进行了测试检查,即当单个组件被禁用时,它会在启动器中反射(消失在应用程序抽屉中),反之亦然,以启用该组件。因此,接收这些信息的启动器可能是某个侦听器或广播。

``
`<receiver android:name=".LauncherBroadcastReceiver" exported="true" enabled="true">`
对于我的问题,一个可能的解决方案(不理想)是在Activity onResume方法中获取禁用的可启动活动列表,然后更新以反映更改

要获取已禁用的可启动活动的列表,请执行以下操作:

  • 查询包管理器中所有可启动的活动(包括已禁用的活动)

    Intent mainLaunchIntent=新的Intent(Intent.ACTION\u MAIN);
    mainLaunchIntent.addCategory(Intent.CATEGORY_启动器);
    mainLaunchIntent.addFlags(PackageManager.MATCH_DISABLED_组件);
    List Activities Information List=packageManager.QueryInputActivities(mainLaunchIntent,0);
    
  • 仅针对已启用的可启动活动查询包管理器

    Intent mainLaunchIntent = new Intent(Intent.ACTION_MAIN);
            mainLaunchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            List<ResolveInfo> activitiesInformationList = packageManager.queryIntentActivities(mainLaunchIntent, 0);
    
    Intent mainLaunchIntent=新的Intent(Intent.ACTION\u MAIN);
    mainLaunchIntent.addCategory(Intent.CATEGORY_启动器);
    List Activities Information List=packageManager.QueryInputActivities(mainLaunchIntent,0);
    
  • 列表(1-2)将是禁用活动的列表。我还没有测试过同样的测试,因为对我来说并不理想。我想等待更多的答案,但如果有人发现同样有用,我可以使用它


  • 在我的例子中,这两个值在默认情况下都是true,正如前面所说的,我能够收到包范围内更改的意图,所以这不是问题,但感谢您的帮助。
    Intent mainLaunchIntent = new Intent(Intent.ACTION_MAIN);
            mainLaunchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            List<ResolveInfo> activitiesInformationList = packageManager.queryIntentActivities(mainLaunchIntent, 0);