actualizar mi aplicación
Estoy desarrollando una aplicación Android no pública, es decir, la aplicación no estará disponible en el Android Market global. La aplicación se instalará en un número limitado de clientes, por ejemplo, utilizando un archivo apk. Tengo un archivo .apk en la tarjeta SD y estoy intentando actualizar mi aplicación desde mi aplicación. Para eso, estoy usando la intención
Mi código
- Android: OnBootReceiver: El receptor exportado no requiere permiso
- Receptor de radiodifusión en fragmento no recibe intención de servicio
- Servicio enlazado a BroadcastReceiver
- Receptor de difusión para llamadas perdidas en android
- Servicio de Android para PubNub
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive"); startActivity(intent);
NOTA: Está funcionando bien, pero después de actualizarlo, la aplicación se cerrará.
La pregunta es " ¿Cómo prevenir esto? "
También utilizo el receptor de difusión para volver a abrir mi aplicación.
public class AutoStart extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ Intent i = new Intent(context, ABCActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); }else{ Intent i = new Intent(context, XYZActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } }
Problema 1: – No se puede volver a abrir la actividad cuando
"android.intent.action.PACKAGE_ADDED",
"android.intent.action.PACKAGE_INSTALL",
"android.intent.action.PACKAGE_CHANGED"
<receiver android:name=".AutoStart" android:enabled="true" android:exported="true" > <intent-filter android:priority="100" > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_INSTALL" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_CHANGED" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver>
"android.intent.action.BOOT_COMPLETED" Trabajando Correctamente
Permisos dados
1 > <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 2 > <uses-permission android:name="android.permission.RESTART_PACKAGES" /> 3 > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- Transmitir datos de la clase BroadcastReceiver a una actividad de Android
- El propósito del servicio debe ser explícito: Intención
- BOOT_COMPLETED no funciona en Android
- Mostrando la notificación al usuario en un momento específico, pero aparece cada vez que cierro o abra mi aplicación?
- Android: ejecutando una tarea de fondo con AlarmManager
- Comunicarse entre diferentes instancias del mismo fragmento
- Determinar la entrada específica del cargador
- Escuchar el botón de volumen cuando el teléfono está bloqueado android
desafortunadamente no se puede impedir que el proceso se termine cuando se reinstale, y por otro lado – nunca recibirá ninguna difusión si es su propia aplicación que se ha reinstalado en ese momento.
si tuviera que implementar tal característica, resolvería el problema como esto:
truco número 1:
la creación de otra aplicación (que se instalaría de alguna manera también en el dispositivo de su usuario) que sólo rollo es actuar como una especie de "watch-dog": esta aplicación escucharía las emisiones de instalación, y porque es la aplicación diferente, instalado – no tendrá problema para lanzar a la "aplicación original".
por supuesto, no se olvide que el usuario tendrá que "lanzar" al menos unos esta aplicación de perro de vigilancia, ya que desde android 4 receptores no funcionará hasta que el proceso de la aplicación comenzó por lo menos los de. eso es por razones de seguridad
truco número 2:
otra opción sería registrarse en manifest you app también a ACTION_TIME_TICK
broadcast. usted puede contar con esta emisión a ser llamada cada número de segundos, e implementar cuando recibe alguna lógica que reconocen si la aplicación ahora mismo necesita iniciar la actividad principal o no.
este enfoque funcionará, pero de las actuaciones la razón no sería tan buena – porque el proceso de la aplicación estaría vivo casi todo el tiempo porque reacciona a esa emisión. si usted no cuida sobre eso – así que no problema
truco número 3:
proporcione pendingIntent
a alarmManager
justo antes de iniciar la actividad de instalación a 30-50 segundos después. la intención pendiente mantendrá la intención de volver a iniciar su aplicación.
suponiendo que la aplicación se instalaría hasta entonces – que funcionaría.
La respuesta aceptada es incorrecta.
Simplemente puede agregar FLAG_ACTIVITY_NEW_TASK a la intención, que inicia el instalador. De esta manera el instalador se ejecutará en un proceso separado y no se matará después de reemplazar el paquete con la nueva versión.
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
Pruebe a usar android.intent.action.MY_PACKAGE_REPLACED
http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED