it-swarm.com.de

Beenden Sie eine Aktivität aus einer anderen Aktivität

Ich möchte eine Aktivität von einer anderen Aktivität beenden, wie:

In Aktivität [A] rufe ich beim Klicken auf die Schaltfläche Aktivität [B] auf, ohne die Aktivität [A] zu beenden.

Jetzt in Aktivität [B] gibt es zwei Schaltflächen, Neu und Ändern . Wenn der Benutzer auf "Ändern" klickt, wird eine Aktivität [A] aus dem Stapel mit allen Optionen hervorgehoben.

Wenn der Benutzer jedoch in der Aktivität [B] auf die Schaltfläche Neu klickt, muss ich die Aktivität [A] aus dem Stapel beenden und diese Aktivität [A] erneut in den Stapel laden.

Ich versuche es, aber ich kann die Aktivität [A] nicht beenden. Wie kann ich das tun?

Ich verwende den Code als:

Von Aktivität [A]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

Eine andere Methode in derselben Aktivität

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

Und in Aktivität [B] klicken Sie auf die Schaltfläche:

setResult(1);
finish();
81
Kanika
  1. Machen Sie Ihre Aktivität A in einer Manifestdatei: launchMode = "singleInstance"

  2. Wenn der Benutzer auf neu klickt, führen Sie FirstActivity.fa.finish(); aus und rufen Sie die neue Absicht auf.

  3. Wenn der Benutzer auf "Ändern" klickt, rufen Sie die neue Absicht auf oder beenden Sie einfach Aktivität B.

ERSTER WEG

Deklarieren Sie in Ihrer ersten Aktivität einen Activity object so,

public static Activity fa;
onCreate()
{
    fa = this;
}

verwenden Sie dieses Objekt jetzt in einer anderen Activity, um die erste Aktivität wie folgt zu beenden.

onCreate()
{
    FirstActivity.fa.finish();
}

ZWEITER WEG

Wenn Sie Ihre Aktivität FirstActivity aufrufen, die Sie beenden möchten, sobald Sie fortfahren, können Sie Sie können ein Flag hinzufügen, während Sie FirstActivity aufrufen.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Mit diesem Flag wird die Aktivität jedoch beendet, wenn Sie nicht möchten. und manchmal onBack wenn Sie die FirstActivity anzeigen wollen, müssen Sie sie mit Absicht aufrufen.

176
MKJParekh

Das können Sie tun, aber ich denke, Sie sollten den normalen Bewegungsfluss nicht unterbrechen. Wenn Sie Ihre Aktivität beenden möchten, können Sie einfach eine Sendung von Aktivität B an Aktivität A senden.

Erstellen Sie einen Rundfunkempfänger, bevor Sie mit Aktivität B beginnen:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

Broadcast von Aktivität B an Aktivität A senden, wenn Sie Aktivität A von B beenden möchten

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

Ich hoffe es klappt für dich ...

71
Bharat Sharma

Dies ist eine ziemlich übliche Kommunikationsfrage. Ein Ansatz wäre die Verwendung eines ResultReceivers in Aktivität A:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

und dann in Aktivität B können Sie es einfach wie gewünscht beenden:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

Versuchen Sie so etwas.

16
Femi

Es gibt einen Ansatz, den Sie in Ihrem Fall verwenden können.

Schritt 1: Starten Sie Aktivität B aus Aktivität A

startActivity(new Intent(A.this, B.class));

Schritt 2: Wenn der Benutzer auf die Schaltfläche "Ändern" klickt, starten Sie Aktivität A mit dem FLAG_ACTIVITY_CLEAR_TOP und übergeben Sie das Flag zusätzlich.

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Schritt 3: Wenn der Benutzer auf die Schaltfläche Hinzufügen klickt, starten Sie Aktivität A mit dem FLAG_ACTIVITY_CLEAR_TOP und übergeben Sie das Flag zusätzlich. FLAG_ACTIVITY_CLEAR_TOP löscht alle geöffneten Aktivitäten bis zum Ziel und startet neu, wenn in der Zielaktivität kein Startmodus definiert ist 

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

Schritt 4: Nun muss die onCreate()-Methode der Aktivität A dieses Flag abrufen.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
10
Dharmendra

Siehe meine Antwort zur Stack Overflow-Frage Alle vorherigen Aktivitäten beenden .

Sie müssen den Intent.FLAG_CLEAR_TOP hinzufügen. Dieses Flag stellt sicher, dass alle Aktivitäten, die über der anvisierten Aktivität im Stack liegen, abgeschlossen sind und eine angezeigt wird.

Eine andere Sache, die Sie benötigen, ist das Flag SINGLE_TOP. Mit dieser Option verhindern Sie, dass Android eine neue Aktivität erstellt, wenn bereits eine im Stapel erstellt wurde. 

Seien Sie vorsichtig, wenn die Aktivität bereits erstellt wurde, wird die Absicht mit diesen Flags in der Methode onNewIntent(intent) (Sie müssen sie überladen, um sie abzuwickeln) in der Zielaktivität bereitgestellt.

Dann haben Sie in onNewIntent eine Methode namens restart oder etwas, das finish() aufruft und eine neue Absicht in Richtung auf sich selbst startet, oder Sie haben eine repopulate()-Methode, die die neuen Daten setzt. Ich bevorzuge den zweiten Ansatz, es ist weniger teuer und Sie können die onCreate-Logik immer in eine separate Methode extrahieren, die Sie zum Auffüllen aufrufen können.

5
DArkO

Ich habe gerade die Lösung von Nepster angewendet und wirkt wie ein Zauber. Es gibt eine kleine Änderung, um es von einem Fragment aus auszuführen.

Zu deinem Fragment

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Und zu Ihrem OnNewIntent () der Aktivität, die Sie neu starten möchten.

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}
4
koras

Beginnen Sie Ihre Aktivität mit dem Anforderungscode:

StartActivityForResult(intent,1003);

Und Sie können es von jeder anderen Aktivität wie dieser schließen:

FinishActivity(1003);
2
yaniv maymon

Ich glaube, ich habe die einfachste Herangehensweise ... beim Drücken von neuem in B ..

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

und in A bekommen es 

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }
2
Xar E Ahmer

Ich weiß, dass dies eine alte Frage ist. Einige dieser Methoden haben für mich nicht funktioniert, also für jeden, der in der Zukunft sucht oder meine Probleme damit hat

Ich überschreibe onPause und rief innerhalb dieser Methode finish() auf.

1
Tony Kutzler

Startaktivität beim ersten Aufruf () als Finish ()

0
Dharmik Ghori