Problema de actualización de la aplicación para Android
Recientemente he estado enfrentando el problema de mi proceso de actualización de la aplicación de Android.
En resumen, la aplicación es capaz de comprobar si la actualización con el código de versión superior se ha cargado en el servidor. Si es así, el usuario decide actualizar. Después de que la aplicación se carga y comienza la instalación estándar:
- No se pueden obtener filtros de intenciones de un paquete
- Android: selección de varias imágenes en la galería y inicio de la intención implícita
- Enlace de Android entre dos actividades en el mismo paquete
- Receptor de difusión de Android que no recibe la intención
- Mi BroadcastReceiver no está recibiendo la intención BOOT_COMPLETED después de mis botas N1
final Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive"); startActivity(intent)
El problema es que cuando Android Intent finaliza la instalación, la actividad "teóricamente" con la información "La aplicación se instaló" y 2 botones "Listo", "Abierto". Escribí "teóricamente" porque hasta ahora he encontrado escenarios a continuación:
-
La aplicación está instalada, se muestra la actividad con el mensaje "Se ha instalado la aplicación", el usuario hace clic en "Abrir", pero no ocurre nada (Android 2.3. *) O la aplicación se abre correctamente: este comportamiento es aleatorio.
-
La aplicación está instalada, se muestra la actividad con el mensaje "La aplicación se instaló" pero de repente desaparece.
Tratando de eludir este error (?) Encontré http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED . BroadcastReceiver que implementé, comenzó Launch Activity y digamos que era una solución adecuada de alguna manera.
<receiver android:name=\".MyReceiver\" > <intent-filter> <action android:name="android.intent.action.ACTION_PACKAGE_REPLACED" /> //Or from API 12 <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" /> </intent-filter> </receiver>
Esta solución tuvo que ser modificada porque las aplicaciones con una API inferior (inferior a 12) no podían manejar ACTION_MY_PACKAGE_REPLACED por lo que implementé un comportamiento dependiente de API que:
-
Permitió instalar la aplicación udpate normalmente y lanzar la aplicación desde la actividad con el botón "Listo" / "Abrir" (API <12)
-
Lanzó la aplicación de actualización a través de MyReceiver después de ACTION_MY_PACKAGE_REPLACED anotando.
Esta es mi solución actual.
Mis preguntas son:
-
¿Por qué la aplicación actualizada se abre al azar después de hacer clic en "Abrir" después de la instalación en android con API inferior a 12?
-
¿Por qué la actividad con los botones "Hecho" / "Abrir" desaparece en los dispositivos con una API más alta?
Intenté terminar applicattion antes de instalar pero no ayudó.
Mi explicación es que después del proceso de instalación, un nuevo paquete tiene que sobrescribir el antiguo para que el paquete antiguo tenga que ser simplemente eliminado y esta es la causa principal de la desaparición de la actividad de lanzamiento.
Como escribí, esta es mi solución actual y no estoy satisfecho. Si alguien pudiera aclarar el asunto, estaría muy agradecido.
Gracias por leer.
Editar:
Ok, la solución es muy simple: a la actualización exitosa es necesario lanzar el Intent como nueva tarea (arrrgh …):
final Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
- Especificación de un filtro de intenciones SEND (compartido) para un servicio
- Extensión de archivo personalizada en Android
- Cómo registrar mi aplicación de Android para abrir mi extensión de archivo personalizada y no para todos los archivos
- Inicio de la aplicación en el arranque completado
- Lidiando con la intención implícita en la depreciación futura en Lollipop
- ¿Necesito agregar un filtro de intenciones al iniciar un servicio?
- Mantener un registro de las actividades iniciadas en Android
Primero, agregue 'intento-filtro' en Manifest como sigue:
`<activity android:name="com.package.MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="file" /> <data android:mimeType="application/vnd.android.package-archive" /> </intent-filter> </activity>`
A continuación, establezca los indicadores de intención para la nueva tarea:
intentAPK.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);