在应用更新时删除了活动别名

时间:2015-11-04 10:45:17

标签: android android-activity android-manifest android-activity-alias

我已经实现了两个Sub apply_Error_Control() Dim cel As Range, _ RangeInForumla As String For Each cel In Selection.Cells If cel.HasFormula Then RangeInForumla = Replace(cel.Formula, "=", "",1,1) cel.Formula = "=IF(" & RangeInForumla & "=0," & Chr(34) & Chr(34) & "," & RangeInForumla & ")" End If Next cel End Sub ,用户应该能够在运行时启用或禁用它。

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

这在开头就像魅力一样,但是当安装了我的应用程序的更新时,别名会再次被禁用。如何防止系统被清单覆盖启用状态?我不希望用户在开始时使用Launcher,我不希望用户在更新后重新创建所有别名快捷方式。

我想我需要类似于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); 的东西,但仅限于启用状态。

谢谢!

2 个答案:

答案 0 :(得分:8)

启用或禁用组件的所有配置都保存在设备的此路径中(0表示设备的第一个用户):

using System.Threading;

string cultureName = "fr-CA";
Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);

DateTime theDate = new DateTime(2015, 11, 06);
theDate.ToString("g");
Console.WriteLine(theDate);

XML的格式是这样的(您只能从root设备中提取文件):

/data/system/user/0/package-restrictions.xml

更新应用时,即使您清除应用数据,启用或禁用的组件也会保持不变。

丢失此设置的唯一情况是包名称或组件名称发生更改。

我认为您的问题是由于组件名称的更改(可能是ProGuard / DexGuard的一些奇怪配置),因为您无法在Play商店上传具有不同包名称的更新。

您可以尝试反编译APK并验证该应用中组件的名称是否相同。

答案 1 :(得分:1)

保存用户在SharedPreferences中选择的选项,并在更新后重新应用它们。为此,您还可以save in preferences the version number,以便了解何时需要应用此功能。

正如您在this回答中所看到的,可以肯定地说这些首选项会保留在应用更新中,因此可能会为您的问题提供解决方案。