2010-12-02 20 views
6

Tengo un requerimiento para reiniciar la aplicación cuando el usuario cambia una preferencia. Limpiar la pila no me ayuda, ya que esto no cancela las llamadas de servicio de back-end. Quiero matar el proceso de solicitud en sí. Estoy usandoCómo reiniciar la aplicación de Android desde la aplicación

Process.killProcess(Process.myPid()); 

y me funciona para matar la aplicación. Pero lo que necesito es reiniciar la aplicación. Significa matar el proceso y desencadenar un nuevo proceso para que la aplicación comience nuevamente de nuevo.

¿Hay alguna manera de hacerlo?

Gracias de antemano.

+0

Me pregunto si esto es necesario para los propósitos de prueba o si es algo que tienes que hacer en una aplicación en vivo? – jcollum

Respuesta

4

Android no está diseñado para hacer esto, y este no es un "requisito". Esta es una implementación. ¿Cuál es exactamente el requisito? ¿Por qué no puedes diseñar tu aplicación para manejar cambios de preferencia sin reiniciar? Esa parece una solución muy pobre.

+0

Tengo un par de entornos de prueba y tienen sus propiedades específicas para establecer la conexión con servidores específicos del entorno. Entonces, cuando cambiamos de entorno, necesito reiniciar toda la aplicación con nuevas propiedades. – AKh

+0

¿Esto es para probar el código o el código de producción? Si es para probar, entonces seguro seguir y matar el proceso. Probablemente pueda reiniciarlo en su código de prueba. – Falmarri

+0

Renuncié a la idea de reiniciar la aplicación, en su lugar estoy restableciendo mi conexión HTTP para restablecer una nueva ya que la anterior se agotó si el dispositivo está inactivo durante más de 20 minutos. Es por eso que queríamos reiniciar la aplicación para restablecer la nueva conexión para conectarnos a nuestros servidores. – AKh

2

Diseñar el sistema operativo para que una aplicación pueda reiniciarse parece una muy mala idea. El sistema operativo Android debe ser libre de matar un proceso para liberar memoria - si la aplicación podría reiniciarse de repente la memoria liberada se utiliza de nuevo. Estoy de acuerdo con Falmarri, debes investigar por qué tu aplicación no puede lidiar con un cambio de preferencia sobre la marcha.

+0

Le di un requisito detallado a Falmarri. ¿Puedes mirar eso y ver si hay alguna manera de hacerlo? Pero de todos modos necesito que la aplicación se reinicie desde dentro de la aplicación. Esto es seguro y esto no se puede cambiar. – AKh

+0

¿Entonces este es esencialmente un método para acelerar el proceso de QA? – jcollum

+0

Nunca se sabe qué requisitos podría tener una aplicación. Por ejemplo, una tableta en la pantalla de una tienda está reproduciendo una película sin parar. Cuando un cliente logra llegar a la pantalla de inicio de Android, la aplicación debe reiniciarse de inmediato. – Yar

5

Esto no es algo que probablemente debería intentar hacer fuera de un entorno de prueba.

Dicho esto, dos ideas:

1) define una alarma para algún momento en el futuro muy próximo y luego matar a su proceso de

2) Poner en marcha algo más (tal vez un pequeño proceso nativo o concha script) que detectará su muerte y lo reiniciará a través de un intento

También podría intentar disparar la intención de iniciarse a sí mismo y luego morir rápidamente, pero esto suena como una posible condición de carrera dependiendo de la implementación. Si agarró la carpeta fd de/proc e hizo cosas malvadas en el código nativo, es posible que pueda despedir la intención de tal manera que su aplicación falle en el retorno de la ioctl ...

0

aquí hay una idea:

tienen un servicio que tiene un proceso diferente al de los demás componentes (actividades, servicios, ...).

para reiniciar la aplicación, llame a este servicio y lo que hará es matar los procesos de los otros componentes de la aplicación y luego enviar un intento a la actividad a la que desea ir.

es solo una idea, ya que nunca lo he probado. dígame si funciona y actualice la pregunta para incluir la respuesta si realmente funciona.

2

Puesto que haya terminado con el proceso de la muerte, para reiniciar la aplicación utilice este código:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 
+0

¡Buena solución! –

1

Si realmente desea reiniciar su actividad, incluyendo una matanza del proceso actual, intenta siguiente código. Colóquelo en una HelperClass o donde lo necesite.

public static void doRestart(Context c) { 
     try { 
      //check if the context is given 
      if (c != null) { 
       //fetch the packagemanager so we can get the default launch activity 
       // (you can replace this intent with any other activity if you want 
       PackageManager pm = c.getPackageManager(); 
       //check if we got the PackageManager 
       if (pm != null) { 
        //create the intent with the default start activity for your application 
        Intent mStartActivity = pm.getLaunchIntentForPackage(
          c.getPackageName() 
        ); 
        if (mStartActivity != null) { 
         mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         //create a pending intent so the application is restarted after System.exit(0) was called. 
         // We use an AlarmManager to call this intent in 100ms 
         int mPendingIntentId = 223344; 
         PendingIntent mPendingIntent = PendingIntent 
           .getActivity(c, mPendingIntentId, mStartActivity, 
             PendingIntent.FLAG_CANCEL_CURRENT); 
         AlarmManager mgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE); 
         mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
         //kill the application 
         System.exit(0); 
        } else { 
         Log.e(TAG, "Was not able to restart application, mStartActivity null"); 
        } 
       } else { 
        Log.e(TAG, "Was not able to restart application, PM null"); 
       } 
      } else { 
       Log.e(TAG, "Was not able to restart application, Context null"); 
      } 
     } catch (Exception ex) { 
      Log.e(TAG, "Was not able to restart application"); 
     } 
    } 

Esto también reiniciará las clases jni y todas las instancias estáticas.

0

Si se trata de un proyecto empresarial donde tiene el control de los dispositivos, puede instalar fácilmente una segunda aplicación que funcione como un perro guardián para la primera. Uno de mis clientes usa una aplicación de vigilancia para manejar cosas como el reinicio nocturno de una aplicación (por razones extrañas, no técnicas) y para buscar e instalar actualizaciones de aplicaciones autoservicio (no Play Store).

Pero si realmente quería a ella desde la aplicación, puede hacer lo siguiente (incluyendo el proceso de matanza más arriba):

Process.killProcess(Process.myPid()); 
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 500 /* half a second*/, 
     PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()), 
           Intent.FLAG_ACTIVITY_NEW_TASK)); 
Cuestiones relacionadas