¿Cómo puedo actualizar de forma programada apk silenciosamente y reiniciar la aplicación?

He intentado muchas maneras dadas en StackOverFlow y otro Web site pero realmente no trabaja.

Mi problema es que tengo esta aplicación que tengo que actualizar y después de actualizar, debería activar automáticamente la misma aplicación (actualizada) de nuevo.

Este es mi código:

private synchronized void runRootUpdate() { // Install Updated APK String command = "pm install -r " + downloadPath + apkFile; Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); int test = proc.waitFor(); // Error is here. if (proc.exitValue() == 0) { // Successfully installed updated app doRestart() } else { // Fail throw new Exception("Root installation failed"); } } private void doRestart() { Intent mStartActivity = new Intent(context, MainActivity.class); int mPendingIntentId = 123456; PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); System.exit(0); } 

Echa un vistazo a mi "Error está aquí." Mi antigua aplicación instalará una nueva aplicación actualizada y se suicidará, por lo tanto no hay proc.waitFor () y terminará de nuevo en la pantalla principal, pero la nueva aplicación actualizada se está instalando. Sin embargo, lo necesito para darle vuelta a sí mismo. ¿Hay alguna manera de hacer eso?

En lugar de establecer una alarma, tiene un manifiesto registrado BroadcastReceiver específicamente para este propósito. Puede oír android.intent.action.PACKAGE_REPLACED (nota: la palabra acción falta en esta constante) o a android.intent.action.MY_PACKAGE_REPLACED

 <receiver android:name="..."> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"></action> <data android:scheme="package" android:path="com.your.package" /> </intent-filter> </receiver> 

Después de reinstalar su receptor recibirá este mensaje y podrá iniciar una Actividad

Actualizar una aplicación implica matar a todos sus procesos. Debe establecer la alarma antes de iniciar el comando pm (con más de un retardo de 100 ms)

Primero de todo usted necesita saber dónde almacenar su archivo .apk porque eso es importante al actualizar la aplicación.

Para actualizar y ejecutar la aplicación en silencio, debe seguir los siguientes pasos.

Asegúrese de que tiene el archivo .apk más reciente en su tarjeta SD al actualizar su aplicación.Si se está lanzando a continuación, a través de la intención como a continuación para la actualización

 File file = new File(Environment.getExternalStorageDirectory(), "app-debug.apk"); // mention apk file path here if (file.exists()) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); } else { Toast.makeText(UpdateActivity.this, "file not exist", Toast.LENGTH_SHORT).show(); } 

El código anterior actualizará su aplicación con el comportamiento predeterminado de android.

Crear un receptor de difusión que sepa cuándo se realiza la actualización

  <receiver android:name=".receiver.OnUpgradeReceiver"> <intent-filter> // Note: This intent can is available starting from API 12 <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> 

Si está usando api> 12 use

 <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> 

Si tiene un api <= 12 use

  <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" android:path="your.app.package" /> 

Crear un receptor de difusión para obtener difusión después de la actividad de actualización y lanzamiento que desea

Ejemplo:

 public class OnUpgradeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // launch your fav activity from here. } } 

El receptor de emisión le ayuda a iniciar la aplicación en silencio.

Espero que esto te ayude.

Hmm … ¿Por qué utilizar este método duro , cuando se utiliza la instalación raíz? ¿Por qué no intentar crear script de shell simple para actualizar la aplicación? Entonces usted no debe fijar la alarma y hacer otras cosas:

Script ( Cómo pasar argumentos , Cómo iniciar la aplicación desde el terminal ):

 am kill com.myapp.package pm install -r $1 am start -n packageName/pkgName.ActivityName 

Código de la aplicación:

 String command = "sh script.sh " + downloadPath + apkFile; Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.