Wydaje się dość nietypowe, aby system Android wyczyścił działanie w opisany sposób, ale w takim przypadku aktywność powinna zostać przywrócona. Android nie powinien niszczyć działania, chyba że zadzwonisz pod numer finish()
lub coś spowoduje, że działanie zakończy się przedwcześnie.
Jeśli odnieść się do diagramu aktywności cyklu życia:
W scenariusza opisanego pierwszą działalność powinna zadzwonić OnStop, ale nie onDestroy, a następnie po powrocie z drugiego aktywności powinien zadzwonić onStart jeszcze raz.
I stworzył bardzo prostą aplikację do testowania scenariusza opisanego, który zawierał następujące elementy:
- Istnieją 2 czynności, FirstActivity i SecondActivity
- FirstActivity posiada przycisk, po kliknięciu przycisku go rozpoczyna SecondActivity z
startActivityForResult()
- działalności imprezach cyklu życia są rejestrowane za pomocą
ActivityLifecycleCallbacks
w klasie niestandardowej aplikacji
- w FirstActivity
onActivityResult
dodatkowo wyjść do l og gdy zostanie wywołany
Oto, co jest wyświetlane:
Aplikacja jest uruchamiana (FirstActivity jest stworzony i uruchomiony i widoczny):
FirstActivity onCreate
FirstActivity onStart
FirstActivity onResume
naciśnięciu przycisku, aby rozpocząć SecondActivity:
FirstActivity onPause
SecondActivity onCreate
SecondActivity onStart
SecondActivity onResume
FirstActivity onSaveInstanceState
FirstActivity onStop
Uwaga, onDestroy nie zostanie wywołany.
Teraz naciśnij przycisk Wstecz i powrócić do pierwszego działalności:
SecondActivity onPause
FirstActivity onStart
FirstActivity onActivityResult
FirstActivity onResume
SecondActivity onStop
SecondActivity onDestroy
Tył Przycisk wywołuje finish
na SecondActivity więc jest zniszczony
Teraz gdybym naciśnij ponownie FirstActivity zostanie także zakończona, powodując wywołanie onDestroy
.
FirstActivity onPause
FirstActivity onStop
FirstActivity onDestroy
Możesz zobaczyć, że ten przykład został dokładnie zastosowany do diagramu cyklu życia. Działania są niszczone tylko po naciśnięciu przycisku Wstecz, co powoduje, że aktywność wywołuje finish()
.
Wspomniał Pan (i), że próbowałeś włączyć opcję "Nie zatrzymuj aktywności" w opcjach dewelopera, możemy powtórzyć powyższy eksperyment z włączoną opcją i zobaczyć, co się stanie. Właśnie dodania odpowiednich zdarzeń cyklu życia, aby zapisać powtarzanie wszystkiego, co powyżej:
Po naciśnięciu przycisku w pierwszej działalności, aby rozpocząć drugą działalność:
...
SecondActivity onResume
FirstActivity onSaveInstanceState
FirstActivity onStop
FirstActivity onDestroy
Zgodnie z oczekiwaniami, działalność została zniszczona to czas. To, co dzieje się podczas przejścia z powrotem do pierwszego aktywności znowu:
SecondActivity onPause
FirstActivity onCreate
FirstActivity onStart
FirstActivity onActivityResult
FirstActivity onResume
...
Tym razem onCreate został powołany ponownie, ponieważ system nie miał zatrzymany wersję pierwszej czynności, aby ponownie uruchomić. Nadal wywoływano onActivityResult()
, niezależnie od tego, czy działanie musiało zostać odtworzone.
To dodatkowo potwierdza, że coś w pierwszej aktywności musi wywoływać finish()
lub powodować awarię. Jednak bez zobaczenia twojego prawdziwego kodu jest to przypuszczenie.
Wreszcie, aby utrzymać stan, czy działalność ma z jakiegoś powodu potrzebujesz, aby odtworzyć, można zastąpić onSaveInstanceState()
i dodawać żadnych informacji o stanie do wiązki:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(MY_STRING_KEY, "my string value");
}
Kiedy działalność jest odtworzony, będziesz dostać pakiet z powrotem w onCreate która powinna zawierać wszystko, co zapisano:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
if (savedInstanceState != null) {
// Restore previous state
}
}
* "moja aplikacja ulega zniszczeniu po wywołaniu funkcji startActivityForResult." Czy masz na myśli awarię? – codeMagic
Czy w pliku manifestu podano filtr zamiany? Jest to potrzebne, aby twoja aktywność mogła zostać odtworzona. – Mann
@codeMagic Nie ulega awarii. Po wywołaniu funkcji startActivityForResult, widzę metodę onDestory w MainActivity, która jest wywoływana. I kiedy wybieram miejsce z uruchomionej aktywności, zwraca. Ale moja aplikacja nie odtwarza . jeśli wybiorę miejsce wystarczająco szybko (przed moją MainActivity) ulegnie zniszczeniu), onActivityResult jest poprawnie wywoływany. – Renjith