Intent.ACTION_PACKAGE_CHANGED - 未收到广播的App组件已禁用

时间:2017-04-26 08:31:18

标签: android android-intent android-launcher android-package-managers

我正在为Android开发一个启动器应用程序,为此我需要我的应用程序通过ACTION_PACKAGE_REMOVED,ACTION_PACKAGE_CHANGED等操作获得系统广播的通知,这些操作会影响可用于用户启动的活动(由我的应用程序显示) )。

广播包安装,包删除,包更新&包禁用/启用正常工作,但问题是当整个包被禁用时,如通过Titanium备份或某些类似的应用程序通过调用的系统广播通知我的广播接收器有动作Intent.ACTION_PACKAGE_CHANGED但是当一个应用程序组件像从MyAndroidTools等应用程序中单独禁用活动,它不会收到我的广播接收器的通知,即由于禁用个别应用程序组件,系统不会从我的应用程序收到广播(使用Intent.ACTION_PACKAGE_CHANGED广播)。

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

<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>

一切都按预期工作,但只有在整个软件包被禁用或启用时才会工作,但是当禁用或启用单个组件(比如活动)时则不行。

肯定有一些方法可以做到这一点,因为我已经用其他一些发射器进行了测试检查,即当单个组件被禁用时,它会在启动器和放大器中被反射(在app抽屉中消失)。反之亦然,以启用该组件。所以那些发射器正在接收这些信息可能是一些听众或广播。

2 个答案:

答案 0 :(得分:0)

`<receiver android:name=".LauncherBroadcastReceiver" exported="true" enabled="true">`

答案 1 :(得分:0)

我的问题的一个可能的解决方案(不理想)是在Activity onResume方法中获取禁用的可启动活动列表,而不是更新以反映更改。

获取已禁用的可启动活动列表:

  1. 查询包管理器以查找所有可启动的活动(包括已禁用的活动)

    Intent mainLaunchIntent = new Intent(Intent.ACTION_MAIN);
            mainLaunchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            mainLaunchIntent.addFlags(PackageManager.MATCH_DISABLED_COMPONENTS);
            List<ResolveInfo> activitiesInformationList = packageManager.queryIntentActivities(mainLaunchIntent, 0);
    
  2. 仅针对已启用的可启动活动查询包管理器

    Intent mainLaunchIntent = new Intent(Intent.ACTION_MAIN);
            mainLaunchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            List<ResolveInfo> activitiesInformationList = packageManager.queryIntentActivities(mainLaunchIntent, 0);
    
  3. 列表(1-2)将是已禁用活动的列表。我没有经过同样的测试,因为对我来说不太理想,我想等待更多的答案,但是如果有人发现同样有用,可以使用它。