cykl życia onNewIntent () i zarejestrowanych detektorów


150

Używam działania singleTop, aby otrzymywać intencje z okna wyszukiwania za pośrednictwem onNewIntent().

Zauważyłem, że onPause()jest to wywoływane przed onNewIntent(), a potem wywołuje onResume(). Naocznie:

  • zainicjowano okno dialogowe wyszukiwania
  • zamiar wyszukiwania wywołał aktywność
  • onPause()
  • onNewIntent()
  • onResume()

Problem w tym, że mam zarejestrowanych słuchaczy, onResume()którzy są usuwani onPause(), ale są potrzebni w onNewIntent()rozmowie. Czy istnieje standardowy sposób udostępniania tych słuchaczy?

Odpowiedzi:


294

onNewIntent()jest pomyślany jako punkt wejścia dla działań singleTop, które są już uruchomione w innym miejscu stosu i dlatego nie mogą wywołać onCreate(). Z punktu widzenia cyklu życia działań należy więc zadzwonić onPause()wcześniej onNewIntent(). Proponuję przepisać swoją aktywność, aby nie używać tych słuchaczy w programie onNewIntent(). Na przykład przez większość czasu moje onNewIntent()metody wyglądają po prostu tak:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

Z całą logiką konfiguracji zachodzącą onResume()przy użyciu getIntent().


@Rodja, czy możesz skomentować ten stackoverflow.com/questions/19092631/ ... także
Deweloper

3
Podobne do pierwotnego pytania: należy pamiętać, jeśli przenieść kod do obsługi przeszukiwanie Intentdo onResume()Twoja aktywność będzie zapewne próbować wykonać wyszukiwać za każdym razem, to CV, prawdopodobnie nie zachowanie chcesz.
Tony Chan,

1
Rodja mówi: Z punktu widzenia cyklu życia działań konieczne jest zatem wywołanie onPause () zanim onNewIntent () Android nie MUSI zaprojektować go w ten sposób. Twoja aktywność przeszła już przez swój cykl życia, aby wznowić (). Android nie ma POTRZEBY, aby wywołać onPause (), a następnie ponownie wywołać onResume (). Jeśli aplikacja zostanie wznowiona, system operacyjny może po prostu wywołać onNewIntent () i pozostać w stanie wznowienia.
Sani Elfishawy

Rodja mówi: Z punktu widzenia cyklu życia działań konieczne jest zatem wywołanie onPause () przed onNewIntent () Android NIE MUSI tak go zaprojektować. Twoja aktywność przeszła już swój cykl życia, aby wznowić. Jeśli czynność zostanie wznowiona, mogą po prostu wywołać funkcję NewIntent () i pozostać w wznowieniu. Problem z sekwencją Androida polega na tym, że nie można odróżnić onPause z powodu działania użytkownika od onPause z powodu zamiaru w tle. Jeśli chcesz działać onPause tylko w przypadku akcji użytkownika, masz przerąbane, ponieważ do przyszłości nie będziesz wiedział, dlaczego użyjesz onPause ().
Sani Elfishawy

Należy zauważyć, że getIntent () nadal zwraca pierwotną intencję. Możesz użyć setIntent (Intent), aby zaktualizować do nowej intencji.
linuxjava

15

Uwaga: Wywołanie metody cyklu życia z innej nie jest dobrą praktyką. W poniższym przykładzie starałem się, aby Twój onNewIntent był zawsze wywoływany niezależnie od typu Twojej Aktywności.

OnNewIntent () zawsze jest wywoływana dla działań singleTop / Task z wyjątkiem pierwszego razu, gdy działanie jest tworzone. W tym czasie onCreate jest nazywany dostarczaniem rozwiązania dla kilku zapytań zadawanych w tym wątku.

Możesz wywołać onNewIntent zawsze, umieszczając go w metodzie onCreate, takiej jak

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
Generalnie nie jest dobrym pomysłem bezpośrednie wywoływanie metod cyklu życia, prawda? Może nieszkodliwa, a może jakaś podstawowa implementacja onNewIntent () zakłada, że ​​onPause () została już wywołana? Prawdopodobnie bezpieczniej jest hermetyzować kod aplikacji w metodzie wywoływanej z obu miejsc.
BernalKC

12
Zgoda. Korzystając z tego podejścia, napotkaliśmy kilka skrajnych przypadków. Najlepiej unikać.
Saad Farooq

3
Tak… ja też zgadzam się na uniknięcie tego… to było dla tych, którzy również chcą wywołać onNewIntent z onCreate.
Pawan Maheshwari
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.