onNewIntent () Lebenszyklus und registrierte Listener

150

Ich verwende eine singleTop-Aktivität, um Absichten von einem Suchdialog über zu erhalten onNewIntent().

Was mir aufgefallen ist, dass onPause()das vorher aufgerufen onNewIntent()wird und danach aufgerufen wird onResume(). Visuell:

  • Suchdialog eingeleitet
  • Suchabsicht auf Aktivität ausgelöst
  • onPause()
  • onNewIntent()
  • onResume()

Das Problem ist, dass ich Listener registriert habe onResume(), die entfernt werden onPause(), aber sie werden innerhalb des onNewIntent()Anrufs benötigt. Gibt es eine Standardmethode, um diese Hörer verfügbar zu machen?

DJayC
quelle

Antworten:

294

onNewIntent()ist als Einstiegspunkt für singleTop-Aktivitäten gedacht, die bereits an einer anderen Stelle im Stapel ausgeführt werden und daher nicht aufgerufen werden können onCreate(). Aus Sicht des Aktivitätslebenszyklus ist es daher erforderlich, onPause()vorher anzurufen onNewIntent(). Ich empfehle Ihnen, Ihre Aktivität neu zu schreiben, um diese Listener nicht innerhalb von zu verwenden onNewIntent(). Zum Beispiel sehen meine onNewIntent()Methoden meistens einfach so aus:

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

Die gesamte Setup-Logik wird mithilfe onResume()von verwendet getIntent().

Rodja
quelle
@ Rodja werden Sie bitte kommentieren Sie diese stackoverflow.com/questions/19092631/… auch
Entwickler
3
Bezogen auf die ursprüngliche Frage: Denken Sie daran , dass Ihre Aktivität wahrscheinlich jedes Mal versucht, eine Suche auszuführen, wenn Sie den Code verschieben, in den die Suche ausgeführt Intentwerden onResume()soll, wahrscheinlich nicht das gewünschte Verhalten.
Tony Chan
1
Rodja sagt: Aus Sicht des Aktivitätslebenszyklus ist es daher erforderlich, onPause () aufzurufen, bevor onNewIntent () Android es nicht so gestalten musste. Ihre Aktivität hat bereits ihren Lebenszyklus durchlaufen, um fortzufahren (). Es ist nicht erforderlich, dass Android onPause () aufruft und dann onResume () erneut aufruft. Wenn die App fortgesetzt wird, kann das Betriebssystem einfach onNewIntent () aufrufen und im wieder aufgenommenen Zustand bleiben.
Sani Elfishawy
Rodja sagt: Aus Sicht des Aktivitätslebenszyklus ist es daher erforderlich, onPause () aufzurufen, bevor onNewIntent () Android es nicht so entwerfen musste. Ihre Aktivität hat bereits ihren Lebenszyklus durchlaufen, um wieder aufgenommen zu werden. Wenn die Handlung fortgesetzt wird, können sie einfach onNewIntent () aufrufen und in der Wiederaufnahme bleiben. Das Problem mit der Sequenz von Android besteht darin, dass es aufgrund einer Hintergrundabsicht unmöglich ist, zwischen onPause aufgrund von Benutzeraktionen und onPause zu unterscheiden. Wenn Sie onPause nur im Falle einer Benutzeraktion ausführen möchten, sind Sie geschraubt, weil Sie bis in die Zukunft nicht wissen, warum Sie onPause () verwenden.
Sani Elfishawy
Es ist wichtig zu beachten, dass getIntent () immer noch die ursprüngliche Absicht zurückgibt. Sie können setIntent (Intent) verwenden, um auf die neue Absicht zu aktualisieren.
Linuxjava
15

Hinweis: Das Aufrufen einer Lebenszyklusmethode von einer anderen Methode ist keine gute Vorgehensweise. Im folgenden Beispiel habe ich versucht zu erreichen, dass Ihr onNewIntent unabhängig von Ihrem Aktivitätstyp immer aufgerufen wird.

OnNewIntent () wird immer für singleTop / Task-Aktivitäten aufgerufen, außer beim ersten Erstellen einer Aktivität. Zu diesem Zeitpunkt wird onCreate als Bereitstellen einer Lösung für einige in diesem Thread gestellte Abfragen bezeichnet.

Sie können onNewIntent immer aufrufen, indem Sie es wie in die onCreate-Methode einfügen

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

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}
Pawan Maheshwari
quelle
59
Im Allgemeinen ist es keine gute Idee, Lebenszyklusmethoden direkt aufzurufen, oder? Vielleicht harmlos oder vielleicht setzt eine Basisimplementierung von onNewIntent () voraus, dass onPause () bereits aufgerufen wurde? Vermutlich sicherer, den App-Code in einer Methode zu kapseln, die von beiden Stellen aus aufgerufen werden kann.
BernalKC
12
Einverstanden. Mit diesem Ansatz sind wir auf einige Randfälle gestoßen. Am besten vermieden.
Saad Farooq
3
Ja, auch ich bin damit einverstanden, dies zu vermeiden. Dies war für diejenigen, die onNewIntent auch von onCreate aus aufrufen möchten.
Pawan Maheshwari