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


Ich möchte eine Aktivität aus einer anderen Aktivität beenden, z.

In Aktivität [A], auf Knopfklick, rufe ich Aktivität [B] auf, ohne 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] mit allen aktivierten Optionen aus dem Stapel entfernt.

Aber wenn der Benutzer auf klickt Neu Klicken Sie auf den Button von Activity [B], dann muss ich Activity [A] vom Stack beenden und diese Activity [A] erneut in den Stack laden.

Ich versuche es, aber ich kann Activity [A] nicht vom Stapel entfernen ... Wie kann ich das machen?

Ich verwende den Code als:

Aus 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], auf Knopf klicken:

setResult(1);
finish();

74
2018-04-30 05:59


Ursprung


Antworten:


  1. Machen Sie Ihre Aktivität A in der Manifestdatei: launchMode = "singleInstance"

  2. Wenn der Benutzer auf "Neu" klickt, machen Sie FirstActivity.fa.finish(); und nenne die neue Absicht.

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

Erster Weg

In deiner ersten Aktivität deklariere eins Activity object so was,

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

Verwenden Sie dieses Objekt jetzt in einem anderen Activity um die erste Aktivität zu beenden,

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

ZWEITE WEISE

Während Sie Ihre Aktivität aufrufen FirstActivity die du beenden willst, sobald du weiterziehst, Sie können während des Anrufs eine Markierung hinzufügen FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Aber mit dieser Flagge wird die Aktivität beendet, auch wenn Sie es nicht möchten. und irgendwann onBack wenn du das zeigen willst FirstActivity Sie müssen es mit Absicht aufrufen.


166
2018-04-30 06:40



Das kannst du, aber ich denke, du solltest den normalen Aktivitätsfluss nicht unterbrechen. Wenn Sie Ihre Aktivität beenden möchten, können Sie einfach eine Übertragung von Ihrer Aktivität B an Aktivität A senden.

Erstellen Sie einen Broadcast-Empfänger, bevor Sie Ihre Aktivität starten B:

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

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

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

Ich hoffe, es wird für dich funktionieren ...


63
2018-04-30 06:14



Dies ist eine ziemlich standardmäßige Kommunikationsfrage. Ein Ansatz wäre, einen ResultReceiver in Aktivität A zu verwenden:

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 folgt beenden:

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

Probieren Sie so etwas aus.


16
2018-04-30 06:15



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 die Aktivität A mit der Taste FLAG_ACTIVITY_CLEAR_TOP. Auch die Flagge in extra übergeben.

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 der Taste FLAG_ACTIVITY_CLEAR_TOP. Auch die Flagge in extra übergeben. 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: Jetzt onCreate() Methode der Aktivität A, müssen dieses Flag abrufen.

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

10
2018-04-30 06:44



Sehen meine Antwort auf Stack Overflow Frage Beenden Alle vorherigen Aktivitäten.

Was Sie brauchen, ist das hinzufügen Intent.FLAG_CLEAR_TOP. Dieses Flag stellt sicher, dass alle Aktivitäten oberhalb der Zielaktivität im Stapel beendet sind und dass eine angezeigt wird.

Eine andere Sache, die Sie brauchen, ist die SINGLE_TOPFlagge. Mit dieser Option verhindern Sie, dass Android eine neue Aktivität erstellt, wenn bereits eine im Stapel erstellt wurde.

Seien Sie vorsichtig, dass die Absicht mit diesen Flags in der aufgerufenen Methode geliefert wird, wenn die Aktivität bereits erstellt wurde onNewIntent(intent) (Sie müssen es überladen, um es zu handhaben) in der Zielaktivität.

Dann in onNewIntent Sie haben eine Methode namens Neustart oder etwas, das angerufen wird finish() und eine neue Absicht zu sich selbst starten, oder a repopulate() Methode, die die neuen Daten setzt. Ich bevorzuge den zweiten Ansatz, es ist weniger teuer und Sie können immer die onCreate Logik in eine separate Methode, die Sie zum Auffüllen aufrufen können.


5
2018-04-30 06:12



Ich habe gerade Nepsters Lösung angewendet und wirkt wie ein Zauber. Es gibt eine geringfügige Änderung, um es von einem Fragment 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 Ihrer 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);
}

3
2018-03-29 12:01



Ich möchte, dass du dir das Teilen ansiehst Hier. Es funktioniert komplett und ohne Probleme.

Aktivität a

public static ActivityA instance = null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instance = this;
}

@Override
public void finish() {
    super.finish();
    instance = null;
}

Aktivität b

public void onCreate(Bundle savedInstanceState) {
    if(ActivityA.instance != null) {
        try {  
            ActivityA.instance.finish(); 
        } catch (Exception e) {}
    }
}

3
2017-10-10 11:01



Ich denke, ich habe den einfachsten Ansatz ... beim Drücken von Neu 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
2018-06-26 14:45



Ich weiß, das ist eine alte Frage, einige dieser Methoden haben nicht für mich funktioniert, also für jeden, der in die Zukunft schaut oder meine Probleme hat, hat das für mich funktioniert

Ich habe überbewertet onPause und angerufen finish() in dieser Methode.


1
2017-09-09 03:34