studio programacion para libros gratis edición desarrollo desarrollar aprende aplicaciones android android-activity android-manifest android-activity-alias

android - programacion - Activity-Alias se elimina en la actualización de la aplicación



programacion android pdf 2018 (2)

Guarde las opciones que el usuario seleccione en SharedPreferences y vuelva a aplicarlas después de la actualización. Para esto, también puede guardar en las preferencias el número de versión , para que pueda saber cuándo se debe aplicar esto.

Como puede ver en this respuesta, es seguro decir que estas preferencias se mantienen en la actualización de la aplicación, por lo que tal vez proporcione una solución para su problema.

He implementado dos activity-alias que el usuario debería poder habilitar o deshabilitar en tiempo de ejecución.

<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>

No quiero que se habiliten al principio, para no saturar la pantalla de la aplicación del dispositivo de los usuarios. Pero en tiempo de ejecución, el usuario debería poder habilitar el alias. Lo hago a través del 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);

Esto funciona como un encanto al principio, pero el alias se desactiva nuevamente cuando se instala una actualización de mi aplicación. ¿Cómo puedo evitar que el sistema sobrescriba el estado habilitado por el manifiesto? No quiero que el usuario flote con Launcher al principio y no quiero que el usuario vuelva a crear todos los accesos directos de alias después de una actualización.

Creo que necesitaría algo similar a PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER , pero solo para el estado habilitado.

¡Gracias!


Todas las configuraciones de los componentes habilitados o deshabilitados se guardan en esta ruta del dispositivo (0 es para el primer usuario del dispositivo):

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

El formato del XML es algo como esto (puede extraer el archivo solo desde un dispositivo rooteado):

<?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>

Cuando actualiza la aplicación, los componentes habilitados o deshabilitados permanecen iguales, incluso si borra los datos de la aplicación.

El único caso en el que se pierde esta configuración es cuando cambia el nombre del paquete o el nombre del componente.

Creo que su problema se debe al cambio del nombre del componente (tal vez alguna configuración extraña de ProGuard / DexGuard), ya que no puede cargar en la tienda de juegos una actualización con un nombre de paquete diferente.

Puede intentar descompilar el APK y verificar si el nombre del componente es el mismo en la aplicación.