我已经实现了两个activity-alias
,用户应该能够在运行时启用或禁用它们。
<activity-alias
android:name=".ui.alias.open_location"
android:targetActivity=".ui.activity.location"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
我不希望在一开始就启用它们,以免弄乱用户设备的应用程序屏幕。但是在运行时,用户应该能够启用别名。我通过PackageManager
完成此操作
PackageManager pm = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName(context, ".ui.alias.open_location");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
这在一开始就像charm一样工作,但当安装了我的应用程序的更新时,别名再次被禁用。如何防止系统通过清单覆盖已启用状态?我不希望用户一开始就使用Launcher,也不希望用户在更新后重新创建所有别名快捷方式。
我想我需要一些类似于PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
的东西,但只适用于已启用状态。
谢谢!
发布于 2015-11-07 00:45:54
启用或禁用组件的所有配置都保存在设备的以下路径中(0表示设备的第一个用户):
/data/system/user/0/package-restrictions.xml
XML的格式如下所示(您只能从有根的设备拉取文件):
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<package-restrictions>
<pkg name="com.example.myapplication">
<enabled-components>
<item name="com.example.myapplication.ActivityAlias" />
</enabled-components>
</pkg>
<preferred-activities />
<persistent-preferred-activities />
<crossProfile-intent-filters />
</package-restrictions>
当您更新应用程序时,启用或禁用的组件保持不变,即使您清除了应用程序的数据。
此设置丢失的唯一情况是当包名称或组件名称更改时。
我认为您的问题是由于组件名称的更改(可能是ProGuard/DexGuard的一些奇怪的配置),因为您无法在play store上载具有不同包名称的更新。
您可以尝试反编译APK,并验证两个应用程序中的组件名称是否相同。
发布于 2015-11-06 22:56:30
将用户选择的选项保存在SharedPreferences中,并在更新后重新应用它们。为此,您还可以使用save in preferences the version number,这样您就可以知道何时需要应用它。
正如你在this answer中看到的,可以肯定地说,这些首选项会在应用程序更新时保留,因此可能会为您的问题提供解决方案。
https://stackoverflow.com/questions/33519799
复制相似问题