2011-12-23 13 views
113

Używam pojedynczej aktywności do odbierania zamiarów z okna dialogowego wyszukiwania przez onNewIntent().onNewIntent() cykl życia i zarejestrowani słuchacze

Zauważyłem, że onPause() jest wywoływane przed onNewIntent(), a następnie wywołuje onResume(). Wizualnie:

  • okno wyszukiwania zainicjowane
  • zamiaru wyszukiwania zwolniony z działalnością
  • onPause()
  • onNewIntent()
  • onResume()

Problem polega na tym, że mam detektory zarejestrowane w onResume() że zostaną usunięte w onPause(), ale są to n wydane w ramach połączenia onNewIntent(). Czy istnieje standardowy sposób udostępnienia tych słuchaczy?

Odpowiedz

213

onNewIntent() służy jako punkt wejścia dla działań SingleTop, które już działają w innym miejscu stosu i dlatego nie mogą wywoływać onCreate(). Z punktu widzenia cyklu życia działań należy zatem zadzwonić pod numer onPause() przed onNewIntent(). Proponuję przepisanie swojej aktywności, aby nie używać tych detektorów wewnątrz onNewIntent(). Na przykład większość czasu moje onNewIntent() metody po prostu wygląda tak:

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

Z całą logikę konfiguracji dzieje się w onResume() wykorzystując getIntent().

+0

@Rodja będziesz prosimy o komentarz na ten http://stackoverflow.com/questions/19092631/logout-from-the-application- android/19092683? noredirect = 1 # 19092683 również – Developer

+0

Powiązane z pytaniem oryginalnym: należy pamiętać, że jeśli przeniesiesz kod, aby obsłużyć wyszukiwanie 'Intent' w' onResume() ', Twoja aktywność będzie prawdopodobnie próbowała wykonać wyszukiwanie za każdym razem, gdy wznowione, prawdopodobnie nie zachowanie, które chcesz. –

+0

Rodja mówi: Z punktu widzenia cyklu życia aktywności konieczne jest wywołanie funkcji onPauza() przed nowością naNewIntent() Android nie musiał tego projektować w ten sposób. Twoja aktywność przeszła już przez cały cykl życia do wznowienia(). Nie ma potrzeby uruchamiania przez androida funkcji onPause(), a następnie wywołania onResume() ponownie. Jeśli aplikacja zostanie wznowiona, os może po prostu wywołać NewNentent() i pozostać w stanie wznowionym. –

13

Funkcja OnNewIntent() zawsze jest wywoływana w celu wykonywania czynności typu singleTop/Task, za wyjątkiem pierwszego uruchomienia działania. W tym momencie wywoływana jest opcjaCreate.

Można powołać onNewIntent zawsze poprzez umieszczenie go w sposób jak onCreate

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

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

Generalnie nie jest to dobry pomysł na bezpośrednie wywoływanie metod cyklu życia, nie? Być może nieszkodliwe, a może podstawowa implementacja onNewIntent() zakłada, że ​​onPause() został już wywołany? Prawdopodobnie bezpieczniej jest enkapsulować kod aplikacji w metodzie możliwej do wywołania z obu miejsc. – BernalKC

+10

Uzgodnione. W tym przypadku natknęliśmy się na kilka przypadków skrajnych. Najlepiej unikać. –

+2

Taa ... ja też zgadzam się na uniknięcie tego ... to było dla tych, którzy chcą wywołać na NewTentent z onCreate również. –

Powiązane problemy