J'ai une application et si l'application se bloque dans une activité particulière, elle redémarre à l'une des activités mères intermédiaires.
C'est un problème pour moi car j'ai quelques informations utilisateur saisies qui sont perdues lors d'un crash.
Existe-t-il un moyen de forcer l'application à démarrer à partir de l'écran du lanceur après un redémarrage après un crash?
Merci.
Ajoutez cette balise Android:clearTaskOnLaunch="true"
dans le fichier manifest.xml à votre activité principale qui doit toujours être lancée.
Raison probable pour laquelle cela n'a pas fonctionné
Lorsque l'application se bloque, elle lance une Exception
et nous devons gérer la Exception
. Sinon, le comportement attendu ne serait pas obtenu
Essayez de gérer toute exception non interceptée et dites au système quoi faire. Pour implémenter cela, essayez les étapes ci-dessous.
Application
uncaughtException
dans votre sous-classe Application
.Activity
, appelez votre classe Application
.Activity
principale (selon vos besoins).Etapes 1 et 2
package com.casestudy.intentsandfilter;
import Android.app.Application;
import Android.content.Intent;
public class MyApplication extends Application
{
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException (Thread thread, Throwable e) {
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e) {
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (getApplicationContext(),DrawView.class);
startActivity(intent);
// Add some code logic if needed based on your requirement
}
}
Étape 3
public class MainActivity extends Activity {
protected MyApplication app;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the application instance
app = (MyApplication)getApplication();
.............
}
}
Étape 4
Modifier la méthode ci-dessous selon vos besoins
private void handleUncaughtException (Thread thread, Throwable e) {
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (getApplicationContext(), HomeActivity.class);
startActivity(intent);
// Add some code logic if needed based on your requirement
}
Je recommanderais d'utiliser une bibliothèque telle que
https://github.com/Ereza/CustomActivityOnCrash
Comme la bibliothèque prend en charge d'autres éléments avec différentes versions d'Android.
J'ai réussi à démarrer mon activité principale avec intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
comme ceci:
private void handleUncaughtException (Thread thread, Throwable e)
{
Intent intent = new Intent (getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Peut-être qu’il n’ya aucun moyen de le faire, mais vous pouvez le signaler pour que vous sachiez si l’activité a été démarrée par une action de l’utilisateur ou si elle a été lancée après un crash.
en d'autres termes, lorsque vous démarrez l'activité parent, transmettez quelque chose dans l'intention startActivity. Si ce n'est pas là, il a été démarré après le crash.
commencez par créer et définir la classe App
dans votre AndroidManifest.xml
et
Android:name=".App"
Android:clearTaskOnLaunch="true"
puis mettez ce code dans la classe App
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable e) {
Log.d("AppCrash", "Error just lunched ");
}
});
}}