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
, но только для разрешенного состояния.
Спасибо!
Ответы
Ответ 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), так как вы не можете загружать в магазин воспроизведения обновление с другим именем пакета.
Вы можете попытаться декомпилировать APK и проверить, совпадает ли имя компонента в обоих приложениях.
Ответ 2
Сохраните параметры, которые пользователь выбирает в SharedPreferences и повторно применяет их после обновления. Для этого вы также можете сохранить в настройках номер версии, чтобы вы могли знать, когда это необходимо применить.
Как вы можете видеть в этом ответе, можно с уверенностью сказать, что эти предпочтения сохраняются при обновлении приложения, поэтому, возможно, это решение для вашей проблемы.