【问题标题】:Activity-Alias gets removed on app updateActivity-Alias 在应用更新时被移除
【发布时间】:2016-02-04 19:49:43
【问题描述】:

我已经实现了两个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);

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

我想我需要类似于PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER 的东西,但仅适用于启用状态。

谢谢!

【问题讨论】:

  • 不存在带有一个 String 参数的 ComponentName 构造函数。你能发布你的实际代码吗?谢谢
  • 是的,我取出了我的 packageName。修好了。

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


【解决方案1】:

所有启用或禁用组件的配置都保存在设备的这个路径中(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并验证两个应用中的组件名称是否相同。

【讨论】:

  • “可能是 ProGuard/DexGuard 的一些奇怪配置”好吧,实际上可能是这样。我会在周末检查这个。到目前为止谢谢你,我会评论我发现的一切。
  • 所以我最终创建了一个新的测试项目。将其安装在设备上,将清单中的一些启用为禁用声明的别名。之后我部署了新版本的测试项目并安装了“更新”。实际上别名仍然存在。而且我不知道为什么,在我的另一个项目中,它们多次消失。我会尝试找出问题,但我认为你的答案应该被接受。
【解决方案2】:

保存用户在 SharedPreferences 中选择的选项,并在更新后重新应用它们。为此您也可以save in preferences the version number,这样您就可以知道何时需要应用。

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

【讨论】:

  • 这对我不起作用,因为更新将删除用户创建的快捷方式。手动设置它们会使主屏幕混乱,因为您无法获取也无法设置快捷方式的放置顺序。不过还是谢谢。
  • 好的,我明白你的意思了。如果你用另一种方式做,它会起作用吗?如果用户未启用它们,则默认将其设置为 true 并在应用启动后将其删除?虽然不是理想的体验......
  • 很遗憾没有,因为第一次安装会看到所有别名,直到他们启动应用程序并且会感到困惑。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2018-08-06
  • 2012-04-08
  • 2013-11-25
相关资源
最近更新 更多