Activity-Alias ​​удаляется при обновлении приложения

Я реализовал два 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, но только для включенного состояния.

Спасибо!

2 ответа

Решение

Все конфигурации включенных или отключенных компонентов сохраняются в этом пути к устройству (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), так как вы не можете загрузить в игровой магазин обновление с другим именем пакета.

Вы можете попытаться декомпилировать APK и проверить, совпадает ли имя компонента в обоих приложениях.

Сохраните параметры, выбранные пользователем в SharedPreferences, и повторно примените их после обновления. Для этого вы также можете сохранить в настройках номер версии, чтобы вы могли знать, когда это необходимо применить.

Как вы видите в этом ответе, можно с уверенностью сказать, что эти настройки сохраняются при обновлении приложения, таким образом, возможно, обеспечивая решение вашей проблемы.

Другие вопросы по тегам