Solución:
Puede capturar todas las excepciones no detectadas en su clase de extensión de aplicación. En el controlador de excepciones, haga algo sobre la excepción e intente configurar AlarmManager para reiniciar su aplicación. Aquí hay un ejemplo de cómo lo hago en mi aplicación, pero solo registro una excepción en una base de datos.
public class MyApplication extends Application {
// uncaught exception handler variable
private UncaughtExceptionHandler defaultUEH;
// handler listener
private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler =
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// here I do logging of exception to a db
PendingIntent myActivity = PendingIntent.getActivity(getContext(),
192837, new Intent(getContext(), MyActivity.class),
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager;
alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
15000, myActivity );
System.exit(2);
// re-throw critical exception further to the os (important)
defaultUEH.uncaughtException(thread, ex);
}
};
public MyApplication() {
defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
// setup handler for uncaught exception
Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
}
}
Básicamente, debe implementar su propia instancia de UncaughtExceptionHandler, luego deberá asegurarse de que por cada hilo que ejecute su aplicación, llame a setUncaughtExceptionHandler.
Luego, cuando ocurre una excepción no detectada en cualquiera de esos subprocesos, su propio UncaughtExceptionHandler
será llamado y desde allí puede programar el reinicio de su aplicación o lo que sea antes de pasar la excepción.
Sin embargo, no sé si realmente tiene sentido reiniciar la aplicación en ese caso. El usuario puede estar bastante “sorprendido” si, en medio de su interacción, la App se ‘reinicia’ y no se reanuda donde estaba hace apenas un segundo, posiblemente incluso perdiendo la entrada anterior del usuario, etc.
Editar:
Mira aquí la respuesta de Gyuri. Aparte de eso, solo necesitas implementar una interfaz, a saber UncaughtExceptionHandler
y ‘pegue’ el código de Gyuri en eso.
Editar # 2:
Como referencia: un servicio iniciado “pegajoso” también podría lograr el resultado deseado.