So beenden Sie die aktuelle Aktivität in Android

77

Ich habe eine Android-Anwendung. Ich mache einen Ladebildschirm mit einem Fortschrittsbalken.

Ich habe eine Verzögerung in der onCreate-Methode eingegeben. Wenn der Timer abgelaufen ist, möchte ich die aktuelle Aktivität beenden und eine neue starten.

Es gibt mir nur eine Ausnahme, wenn es die finish()Methode aufruft .

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

Wie kann ich den Code so ändern, dass er endet, wenn der Fortschrittsbalken fertig ist?

Schah
quelle

Antworten:

126

Wenn Sie einen Ladebildschirm ausführen, stellen Sie den Parameter einfach so ein, dass er nicht im Aktivitätsstapel bleibt. In Ihrer manifest.xml, in der Sie Ihre Aktivität definieren, gehen Sie wie folgt vor:

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

In Ihrem Code müssen Sie .finish () nicht mehr aufrufen. Führen Sie einfach startActivity (i) aus.

Es ist auch nicht erforderlich, eine Instanz Ihrer aktuellen Aktivität in einem separaten Feld zu speichern. Sie können jederzeit wie LoadingScreen.this.doSomething()statt darauf zugreifenprivate LoadingScreen loadingScreen;

Alex Orlov
quelle
Mit diesem Parameter wird die Aktivität mit startActivity und auch mit startActivityForResult beendet. Es hat mich heute
gebissen
noHistoryist nicht dasselbe wiefinish()
Blueware
49

Ich habe versucht, dieses Beispiel zu verwenden, aber es ist kläglich gescheitert. Jedes Mal, wenn ich finish () / finishactivity () in einem Handler aufrufe, ist dies bedrohlich java.lang.IllegalAccess Exception. Ich bin mir nicht sicher, wie es für denjenigen funktioniert hat, der die Frage gestellt hat.

Stattdessen habe ich eine Lösung gefunden, die eine Methode in Ihrer Aktivität erstellt, z

void kill_activity()
{ 
    finish();
}

Rufen Sie diese Methode innerhalb der Ausführungsmethode des Handlers auf. Das hat für mich wie ein Zauber gewirkt. Hoffe, dies hilft jedem, der Probleme damit hat, "eine Aktivität aus einem anderen Thread zu schließen?".

Sriram
quelle
13

Sie müssen finish()vom UI-Thread aus aufrufen , nicht von einem Hintergrund-Thread. Die Möglichkeit dazu besteht darin, einen Handler zu deklarieren und den Handler aufzufordern, eine ausführbare Datei auf dem UI-Thread auszuführen. Zum Beispiel:

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();
    }
}
Ted Hopp
quelle
1
@AndreiBuneyeu - Es gibt eine allgemeine Regel ( hier angegeben ): " Greifen Sie nicht von außerhalb des UI-Threads auf das Android-UI-Toolkit zu". Während der Begriff "Android UI Toolkit" nirgendwo in den Dokumenten definiert ist (was ich finden konnte), erscheint es vernünftig, die Methoden des Aktivitätslebenszyklus als Teil davon zu betrachten. ( Natürlich fallen einige ActivityMethoden - wie Activity.runOnUiThread(Runnable)- nicht unter diese Einschränkung. Ich stimme Ihnen zu, dass die Dokumente nicht so klar sind, wie sie zu diesem Thema sein müssen.)
Ted Hopp
11

Wenn Sie eine neue Aktivität starten und die aktuelle Aktivität beenden möchten, können Sie Folgendes tun:

API 11 oder höher

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

API 10 oder niedriger

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

Ich hoffe das kann jemandem helfen =)

Daniel S.
quelle
9

Rufen Sie einfach die finish()Methode auf:

context.finish();
Thiago
quelle
3
Welche Endmethode? Ich sehe keine this.finish () Methode in der Aktivität
nurettin
2

Sie können auch Folgendes verwenden: finishAffinity ()

Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben.

Carlos Rodríguez
quelle
2

Ich habe viele Antworten gefunden, aber keine ist einfach ... Ich hoffe, das wird dir helfen ...

try{
    Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
    startActivity(intent);
} finally {
    finish();
}

Daher ist hier eine sehr einfache Logik zu finden, da wir wissen, dass wir in Java Code schreiben, der einige Ausnahmewahrscheinlichkeiten in einem try-Block aufweist, und diese Ausnahme im catch-Block behandeln, aber im letzten Block Code schreiben, der um jeden Preis ausgeführt werden muss ( Entweder kommt die Ausnahme oder nicht).

Hi-Tech-Genie
quelle
2

Ich habe eine neue Aktivität gestartet und dann die aktuelle Aktivität geschlossen. Denken Sie also an diese einfache Regel:

finish()
startActivity<...>()

und nicht

startActivity<...>()
finish()
Blueware
quelle