78 votes

Comment finir l'activité actuelle de Android

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

J'ai participé à 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 lors de l'appel à l' finish() méthode.

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 de sorte qu'il se termine lorsque la barre de progression est fait?

133voto

Alex Orlov Points 9229

Si vous faites un écran de chargement, il suffit de régler le paramètre de ne pas tenir l'activité de la pile. Dans votre manifest.xml où pouvez-vous définir votre activité à faire:

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

Et dans ton code il n'y a pas besoin de l'appeler .finish() plus. Il suffit de ne startActivity(i);

Il ya aussi pas besoin de garder une instance de votre activité en cours dans un champ distinct. Vous pouvez toujours y accéder comme LoadingScreen.this.doSomething() au lieu de private LoadingScreen loadingScreen;

51voto

Sriram Points 519

J'ai essayé à l'aide de cet exemple, mais il a échoué lamentablement. Chaque fois que j'utilise pour invoquer finish()/ finishactivity() à l'intérieur d'un gestionnaire, je me retrouve avec cette menaçant java.lang.IllegalAccess Exception. je ne suis pas sûr de comment ça fonctionne pour celui qui a posé la question.

Au lieu de cela la solution que j'ai trouvé est de créer une méthode dans votre activité, telles qu'

void kill_activity()
{ 
    finish();
}

Appeler cette méthode à partir de l'intérieur de la méthode run de la gestionnaire. Cela a fonctionné comme un charme pour moi. Espérons que cela aide quelqu'un aux prises avec "comment fermer une activité à partir d'un autre thread?".

13voto

Ted Hopp Points 122617

Vous devez appeler finish() de la thread de l'INTERFACE utilisateur, pas un thread d'arrière-plan. La façon de le faire est de déclarer un Gestionnaire et demander au Gestionnaire d'exécuter un Exécutable sur le thread d'INTERFACE utilisateur. 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();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X