J'utilise Thread.setDefaultExceptionHandler() pour essayer de démarrer une nouvelle activité, le redémarrage de manière efficace l'application. Toutefois, il semble que le ActivityManager tue le nouveau processus de l'application juste après son démarrage.après Android uncaughtException, ActivityManager ne force le nouveau processus d'arrêt
J'ai essayé un certain nombre d'expériences. Le code est le plus réussi, dans le gestionnaire d'exception:
public void handleUncaughtException (Thread thread, Throwable e)
{
Intent intent = new Intent (getBaseContext(), RestartActivity.class);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pending =
PendingIntent.getActivity (getBaseContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
try {
pending.send();
}
catch (PendingIntent.CanceledException e1) {
logE ("send pending intent:" + e1); // logE is a wrapper for Log.e().
}
System.exit (1);
}
Dans ce cas, la RestartActivity démarre et affiche, mais seulement pour une seconde. Ensuite, l'application est complètement disparue et Android affiche ce qui était l'application précédente.
Le fichier journal contient ce (notez les pid sont légèrement différentes):
05-29 22:46:28.429 1465-3665/? I/ActivityManager: Force stopping com.perinote.crashtest appid=10170 user=0: from pid 14484
05-29 22:46:28.429 1465-3665/? I/ActivityManager: Killing 14486:com.perinote.crashtest/u0a170 (adj 0): stop com.perinote.crashtest
J'ai aussi essayé d'utiliser AlarmManager, dans cette variante:
public void handleUncaughtException (Thread thread, Throwable e)
{
Intent intent = new Intent (getBaseContext(), RestartActivity.class);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pending =
PendingIntent.getActivity (getBaseContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarm = (AlarmManager)getSystemService (Context.ALARM_SERVICE);
alarm.set (AlarmManager.RTC, System.currentTimeMillis() + 3000, pending);
System.exit (1);
}
Dans ce cas, RestartActivity doesn « affichage t du tout, et je vois une ligne dans le logcat comme ceci:
05-29 22:06:46.841 1465-11842/? I/ActivityManager: Force stopping com.perinote.crashtest appid=10170 user=0: from pid 12551
Qu'est-ce que Causin g Android veut tellement tuer le processus qui vient de commencer?
Avez-vous essayé d'utiliser ** android.os.Process.killProcess **? –
Je ne pense pas, mais ça fait longtemps. Ce n'est pas actuellement sur ma liste de priorités donc ce sera un "temps" plus long avant d'essayer quoi que ce soit d'autre. Merci. –
N'utilisez pas ** System.exit (1) **, car il ne nettoie pas la pile des tâches et ne permet pas au système d'exploitation de quitter proprement votre application. En savoir plus sur la pile de tâches ici: https://developer.android.com/guide/components/activities/tasks-and-back-stack.html –