web-dev-qa-db-fra.com

android: gérer l'application Crash et démarrer une activité particulière

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.

12
Wise Shepherd

Solution proposée 1 -

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

Solution proposée 2

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.

  1. Créer une classe étendant la classe Application
  2. Manipulez uncaughtException dans votre sous-classe Application.
  3. Dans votre lanceur Activity, appelez votre classe Application.
  4. Après avoir attrapé une exception, démarrez votre Activity principale (selon vos besoins).

Exemple de code

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
}
13
Prem

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.

 enter image description here

10

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);
  }
0
Adrian

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.

0
imorsi

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 ");
                }
            });
}}

Capture d'écran du journal de débogage

0
Hakim Douib