Comment terminer l'activité actuelle dans Android

j'ai une application Android. Je fais un écran de chargement avec une barre de progression.

j'ai entré un retard dans la méthode onCreate. Lorsque la minuterie finitions, je veux terminer l'activité en cours et en commencer une nouvelle.

il me donne juste une exception quand il appelle la méthode finish() .

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer
        {
            public void onTick(long l) 
            {

            }

            @Override
            public void onFinish() 
            {
                loadingScreen.finishActivity(0);
                startActivity(i);
            };
        }.start();
    }
}

Comment puis-je changer le code pour qu'il se termine lorsque la barre de progression est terminée?

64
demandé sur Eric Leschinski 2011-02-15 10:11:54

6 réponses

si vous faites un écran de chargement, définissez simplement le paramètre pour ne pas le garder dans la pile d'activités. Dans votre manifeste.xml, où vous définissez votre activité faire:

<activity android:name=".LoadingScreen" android:noHistory="true" ... />

et dans votre code il n'y a pas besoin d'appeler .finish() plus. Il suffit de faire l'activité de démarrage (i);

il n'est pas non plus nécessaire de conserver une instance de votre activité actuelle dans un champ distinct. Vous pouvez toujours y accéder comme LoadingScreen.this.doSomething() au lieu de private LoadingScreen loadingScreen;

112
répondu Alex Orlov 2011-02-15 07:19:34

j'ai essayé d'utiliser cet exemple mais il a échoué lamentablement. Chaque fois que j'invoque finish()/ finishactivity() à l'intérieur d'un handler, je me retrouve avec cette menace java.lang.IllegalAccess Exception . Je ne sais pas comment ça a marché pour celui qui a posé la question.

la solution que j'ai trouvée était de créer une méthode dans votre activité telle que

void kill_activity()
{ 
    finish();
}

invoquez cette méthode depuis l'intérieur de la méthode run du handler. Cela a fonctionné comme un charme pour moi. Espérer cela aide toute personne aux prises avec "Comment fermer une activité à partir d'un fil différent?".

42
répondu Sriram 2013-09-14 23:44:47

vous devez appeler finish() à partir du thread UI, pas un thread d'arrière-plan. La façon de procéder est de déclarer un gestionnaire et de demander au gestionnaire d'exécuter une exécutable sur le thread UI. Par exemple:

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new Handler();
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer
        {
             @Override
             public void onTick(long l) 
             {

             }

             @Override
             public void onFinish() 
             {
                 handler.post(new Runnable() {
                     public void run() {
                         loadingScreen.finishActivity(0);
                         startActivity(i);
                     }
                 });
             };
        }.start();
    }
}
11
répondu Ted Hopp 2013-09-14 23:51:12

appelez simplement la méthode finish() :

context.finish();
7
répondu Joolah 2015-03-05 05:56:58

quand vous voulez commencer une nouvelle activité et terminer l'activité actuelle, vous pouvez le faire:

API 11 ou plus

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

API 10 ou inférieur

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

j'espère que cela peut aider quelqu'un =)

7
répondu Daniel S. 2016-05-16 07:00:28

vous pouvez également utiliser: finishAffinity ()

terminer cette activité ainsi que toutes les activités immédiatement au-dessous dans la tâche actuelle qui ont la même affinité.

1
répondu Carlos Rodríguez 2018-06-13 17:00:27