Pytanie w sprawie android-intent, android-activity, android – Zakończ działanie z innego działania

82

Chcę zakończyć jedno działanie z innego działania, np .:

W działaniu [A], klikając przycisk, dzwonię do aktywności [B] bez ukończenia czynności [A].

Teraz w działaniu [B] są dwa przyciski,Nowy iModyfikować. Gdy użytkownik kliknie modyfikację, wybierz z stosu aktywność [A] ze wszystkimi zaznaczonymi opcjami.

Ale kiedy użytkownik kliknieNowy przycisk Aktywność [B], wtedy będę musiał zakończyć Aktywność [A] ze stosu i ponownie załadować Aktywność [A] na stos.

Próbuję, ale nie jestem w stanie zakończyć aktywności [A] ze stosu ... Jak mogę to zrobić?

Używam kodu jako:

Z działania [A]:

<code>Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);
</code>

Inna metoda w tej samej działalności

<code>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);
        }
    }
}
</code>

A w działaniu [B] kliknij przycisk:

<code>setResult(1);
finish();
</code>
hej, chciałeś skończyć jedną czynność z drugiej, a potem wysłałem poprawną odpowiedź. Ale dlaczego zagłosowałeś? Manjunath
Wątek zawiera kilka fajnych odpowiedzi:stackoverflow.com/questions/14355731/… a b

Twoja odpowiedź

9   odpowiedzi
2

StartActivityForResult(intent,1003);

I możesz zamknąć go z każdej innej aktywności takiej jak ta:

FinishActivity(1003);
16

y użycie obiektu ResultReceiver w działaniu 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);

a następnie w ćwiczeniu B możesz po prostu skończyć na żądanie w taki sposób:

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

Spróbuj som, tak i tak.

+1 tylko, ((ResultReceiver) getIntent (). GetParcelableExtra ("finisher")). Send (1, nowy Bundle ()); Hamidreza Sadegh
Nie To nie działa Kanika
+1 Świetnie. To dla mnie coś nowego. Dharmendra
Świetna odpowiedź +1 Sharp Edge
73

ale myślę, że nie powinieneś przerywać normalnego przepływu aktywności. Jeśli chcesz zakończyć swoją aktywność, możesz po prostu wysłać transmisję ze swojej aktywności B do działania A.

Utwórz odbiornik przed rozpoczęciem aktywności 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"));

Wyślij transmisję z działania B do działania A, gdy chcesz zakończyć aktywność A z B.

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

Mam nadzieję, że to zadziała dla ciebie ...

To jest rozwiązanie. niezłe Parinda Rajapaksha
Nie zapomnij się wyrejestrowaćbroadcast_receiver zunregisterReceiver() Jaec
Działa dobrze, dziękuję! Nick
4

niewielka modyfikacja, aby uruchomić go z Fragmentu.

Do twojego fragmentu

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

A do Twojego OnNewIntent () działania, które chcesz ponownie uruchomić.

// 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);
}
1

że to stare pytanie, kilka z tych metod nie zadziałało dla mnie, więc dla każdego, kto patrzy w przyszłość lub ma moje kłopoty, działało to dla mnie

NadużyłemonPause i zadzwoniłfinish() wewnątrz tej metody.

5

moja odpowiedź na pytanie Przepełnienie stosuZakończ Wszystkie poprzednie czynności.

Musisz dodaćIntent.FLAG_CLEAR_TOP. Ta flaga zapewnia, że ​​wszystkie działania powyżej docelowej aktywności w stosie są zakończone i że ta jest pokazana.

Kolejna rzecz, której potrzebujesz toSINGLE_TOP flaga. W ten sposób uniemożliwisz Androidowi utworzenie nowej aktywności, jeśli jest już utworzona na stosie.

Po prostu bądź ostrożny, że jeśli działanie zostało już utworzone, zamiar z tymi flagami zostanie dostarczony w metodzie zwanejonNewIntent(intent) (musisz go przeładować, aby go obsłużyć) w działaniu docelowym.

Potem wonNewIntent masz metodę o nazwie restart lub coś, co zadzwonifinish() i wprowadzić nowy zamiar do siebie lub miećrepopulate() metoda, która ustawi nowe dane. Wolę drugie podejście, jest tańsze i zawsze możesz wyodrębnićonCreate logika w oddzielną metodę, którą można wywołać dla zaludnienia.

Świetna odpowiedź DArko ... naprawdę fajne rozwiązanie .... :) Chirag_CID
2

że mam najłatwiejsze podejście ... po naciśnięciu nowego w B ..

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

iw A dostań to

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

Krok 1: Rozpocznij aktywność B od czynności A

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

Krok 2: Jeśli użytkownik kliknie przycisk modyfikuj, rozpocznij działanie A za pomocą przyciskuFLAG_ACTIVITY_CLEAR_TOP.Przejść flagę dodatkowo.

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

Krok 3: Jeśli użytkownik kliknie przycisk Dodaj, rozpocznij działanie A za pomocą przyciskuFLAG_ACTIVITY_CLEAR_TOP.Przejść flagę dodatkowo.FLAG_ACTIVITY_CLEAR_TOP wyczyści wszystkie otwarte działania do celu i zrestartuje, jeśli w działaniu docelowym nie zdefiniowano trybu uruchamiania

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

Krok 4: TerazonCreate() metoda działania A, należy pobrać tę flagę.

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
niezła odpowiedź.... MKJParekh
176

launchMode = "singleInstance"

Gdy użytkownik kliknie nowy, zróbFirstActivity.fa.finish(); i nazwij nowy zamiar.

Gdy użytkownik kliknie modyfikuj, zadzwoń do nowego zamiaru lub po prostu zakończ aktywność B.

PIERWSZY SPOSÓB

W swojej pierwszej działalności zadeklaruj jedenActivity object lubię to,

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

teraz używaj tego obiektu w innymActivity skończyć pierwszą aktywność w ten sposób,

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

DRUGI SPOSÓB

Dzwoniąc na swoją aktywnośćFirstActivity które chcesz zakończyć zaraz po przejściu, Możesz dodać flagę podczas rozmowyFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Ale za pomocą tej flagi aktywność zakończy się, nawet jeśli tego nie chcesz. a czasemonBack jeśli chcesz pokazaćFirstActivity będziesz musiał to nazwać intencją.

Pracuj jak urok;) MashukKhan
Zaakceptowana, ale zła odpowiedź. Jak wspomniano powyżej, spowoduje to wyciek pamięci. m0skit0
Plus za zadeklarowanie pojedynczego działania nie jest również dobrą praktyką. Jest to zalecane podejście tylko dla aplikacji typu Launcher. Zamiast tego należy użyć „singleTop”. DArkO
Proszę, nikt nie używa pierwszego rozwiązania, jest całkowicie błędne. Pomijasz platformę Android w bardzo hackowy sposób, tworząc obiekt zombie. Użyj odbiornika transmisji. S-K'

Powiązane pytania