Chcę zakończyć jedną czynność z innej, na przykład:
W działaniu [A] po kliknięciu przycisku wywołuję działanie [B] bez kończenia działania [A].
Teraz w ćwiczeniu [B] są dwa przyciski, Nowy i Modyfikuj . Gdy użytkownik kliknie modyfikację, zdejmij działanie [A] ze stosu z zaznaczonymi wszystkimi opcjami.
Ale kiedy użytkownik kliknie przycisk Nowy w Aktywności [B], będę musiał zakończyć Czynność [A] ze stosu i ponownie załadować to Aktywność [A] do stosu.
Próbuję, ale nie mogę zakończyć działania [A] ze stosu… Jak mogę to zrobić?
Używam kodu jako:
Z działania [A]:
Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);
Inna metoda w tym samym działaniu
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);
}
}
}
W ćwiczeniu [B] po kliknięciu przycisku:
setResult(1);
finish();
Odpowiedzi:
Umieść swoje działanie A w pliku manifestu:
launchMode = "singleInstance"
Kiedy użytkownik kliknie nowy, zrób
FirstActivity.fa.finish();
i wywołaj nowy zamiar.Kiedy użytkownik kliknie modyfikację, wywołaj nową intencję lub po prostu zakończ czynność B.
PIERWSZY SPOSÓB
W swojej pierwszej czynności zadeklaruj
Activity object
taką osobę:teraz użyj tego obiektu w innym,
Activity
aby zakończyć pierwszą czynność w ten sposób,DRUGI SPOSÓB
Podczas wywoływania aktywności,
FirstActivity
którą chcesz zakończyć zaraz po przejściu, możesz dodać flagę podczas dzwonieniaFirstActivity
Ale przy użyciu tej flagi działanie zostanie zakończone, nawet jeśli tego nie chcesz. i czasami,
onBack
jeśli chcesz to pokazaćFirstActivity
, będziesz musiał to nazwać używając intencji.źródło
Możesz to zrobić, ale myślę, że nie powinieneś przerywać normalnej aktywności. Jeśli chcesz zakończyć swoją aktywność, możesz po prostu wysłać transmisję ze swojego działania B do działania A.
Utwórz odbiornik transmisji przed rozpoczęciem działalności B:
Wyślij transmisję z działania B do działania A, gdy chcesz zakończyć działanie A z działania B.
Mam nadzieję, że to zadziała ...
źródło
broadcast_receiver
zunregisterReceiver()
To jest dość standardowe pytanie komunikacyjne. Jednym podejściem byłoby użycie elementu ResultReceiver w ćwiczeniu A:
a następnie w Działaniu B możesz po prostu zakończyć to na żądanie w następujący sposób:
Spróbuj czegoś takiego.
źródło
Jest jedno podejście, które możesz zastosować w swoim przypadku.
Krok 1: Rozpocznij ćwiczenie B od działania A
Krok 2: Jeśli użytkownik kliknie przycisk modyfikacji, uruchom działanie A za pomocą
FLAG_ACTIVITY_CLEAR_TOP
.Also, przekaż flagę dodatkowo.Krok 3: Jeśli użytkownik kliknie przycisk Dodaj, uruchom działanie A za pomocą
FLAG_ACTIVITY_CLEAR_TOP
.Also, przekaż flagę dodatkowo.FLAG_ACTIVITY_CLEAR_TOP
wyczyści wszystkie otwarte działania aż do celu i uruchomi się ponownie, jeśli tryb uruchamiania nie jest zdefiniowany w działaniu docelowymKrok 4: Teraz
onCreate()
metoda działania A, musisz pobrać tę flagę.źródło
Rozpocznij swoją aktywność od kodu żądania:
Możesz je zamknąć z dowolnej innej czynności, takiej jak ta:
źródło
Zobacz moją odpowiedź na pytanie o przepełnienie stosu Zakończ Wszystkie poprzednie działania .
Musisz dodać rozszerzenie
Intent.FLAG_CLEAR_TOP
. Ta flaga zapewnia, że wszystkie działania powyżej docelowej aktywności w stosie są zakończone i że jest ona wyświetlana.Kolejną rzeczą, której potrzebujesz, jest
SINGLE_TOP
flaga. Dzięki temu zapobiegniesz tworzeniu przez system Android nowego działania, jeśli istnieje już utworzone w stosie.Uważaj tylko, jeśli działanie zostało już utworzone, intencja z tymi flagami zostanie dostarczona w wywołanej metodzie
onNewIntent(intent)
(musisz ją przeciążać, aby ją obsłużyć) w działaniu docelowym.Następnie
onNewIntent
masz metodę o nazwie restart lub coś, co wywołafinish()
i uruchomi nową intencję wobec siebie, lub marepopulate()
metodę, która ustawi nowe dane. Wolę drugie podejście, jest tańsze i zawsze możesz wyodrębnićonCreate
logikę do oddzielnej metody, którą możesz wywołać w celu wypełnienia.źródło
Właśnie zastosowałem rozwiązanie Nepstera i działa jak urok. Istnieje niewielka modyfikacja umożliwiająca uruchomienie go z fragmentu.
Do twojego fragmentu
Oraz do OnNewIntent () działania, które chcesz ponownie uruchomić.
źródło
Myślę, że mam najłatwiejsze podejście ... do wciskania nowego w B.
iw A weź to
źródło
Wiem, że to stare pytanie, kilka z tych metod nie działało w moim przypadku, więc dla każdego, kto patrzy w przyszłość lub ma problemy, zadziałało to dla mnie
Przekonałem
onPause
i zadzwoniłemfinish()
do tej metody.źródło
Najpierw zadzwoń,
startactivity()
a następnie użyjfinish()
źródło