onNewIntent () ciclo di vita e listener registrati


150

Sto usando un'attività SingleTop per ricevere intenti da una finestra di dialogo di ricerca tramite onNewIntent().

Quello che ho notato è che onPause()viene chiamato prima onNewIntent()e poi chiama onResume(). visivamente:

  • finestra di dialogo di ricerca avviata
  • intento di ricerca generato dall'attività
  • onPause()
  • onNewIntent()
  • onResume()

Il problema è che ho ascoltatori registrati onResume()che vengono rimossi onPause(), ma sono necessari all'interno della onNewIntent()chiamata. Esiste un modo standard per rendere disponibili quegli ascoltatori?

Risposte:


295

onNewIntent()è inteso come punto di ingresso per le attività singleTop che sono già in esecuzione altrove nello stack e quindi non possono chiamare onCreate(). Dal punto di vista del ciclo di vita delle attività è quindi necessario chiamare onPause()prima onNewIntent(). Ti consiglio di riscrivere la tua attività per non usare questi ascoltatori all'interno di onNewIntent(). Ad esempio, la maggior parte delle volte i miei onNewIntent()metodi sono semplicemente così:

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

Con tutta la logica di installazione in corso onResume()utilizzando getIntent().


@Rodja, per favore, commenterai questo stackoverflow.com/questions/19092631/… anche
Developer

3
Relativi a domanda iniziale: tenere a mente se si sposta il codice per gestire la ricerca Intentin onResume(), la vostra attività sarà probabilmente provare ad eseguire una ricerca ogni volta che si riprende, probabilmente non il comportamento desiderato.
Tony Chan,

1
Rodja dice: Dal punto di vista del ciclo di vita delle attività è quindi necessario chiamare onPause () prima che onNewIntent () Android non abbia BISOGNO di progettarlo in questo modo. La tua attività ha già attraversato il suo ciclo di vita per riprendere (). NESSUN BISOGNO per Android di chiamare onPause () quindi chiamare nuovamente OnResume (). Se l'app viene ripresa, il sistema operativo potrebbe semplicemente chiamare onNewIntent () e rimanere nello stato di ripresa.
Sani Elfishawy,

Rodja dice: Dal punto di vista del ciclo di vita delle attività, è quindi necessario chiamare onPause () prima che onNewIntent () Android non abbia BISOGNO di progettarlo così. La tua attività ha già attraversato il suo ciclo di vita per riprendere. Se l'atto viene ripreso, può semplicemente chiamare NewIntent () e rimanere nel riassunto. Il problema con la sequenza di Android è che rende impossibile distinguere tra onPause a causa dell'azione dell'utente e onPause a causa di un intento di fondo. Se vuoi agire suPausa solo in caso di azione dell'utente sei fregato perché non saprai fino al futuro perché vai su onPause ().
Sani Elfishawy,

Un punto importante da notare è che getIntent () restituisce ancora l'intento originale. È possibile utilizzare setIntent (Intent) per aggiornare al nuovo Intent.
linuxjava,

15

Nota: chiamare un metodo del ciclo di vita da un altro non è una buona pratica. Nell'esempio seguente ho cercato di ottenere che onNewIntent verrà sempre chiamato indipendentemente dal tipo di attività.

OnNewIntent () viene sempre chiamato per le attività SingleTop / Task, tranne per la prima volta quando viene creata l'attività. In quel momento onCreate viene chiamato fornendo alla soluzione per alcune query poste su questo thread.

Puoi invocare onNewIntent sempre inserendolo nel metodo onCreate come

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

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

59
Generalmente non è una buona idea chiamare direttamente i metodi del ciclo di vita, no? Forse innocuo o forse un'implementazione base di onNewIntent () presuppone che onPause () sia già stato chiamato? Presumibilmente più sicuro incapsulare il codice dell'app in un metodo richiamabile da entrambe le posizioni.
BernalKC,

12
Concordato. Ci siamo imbattuti in alcuni casi limite usando questo approccio. Meglio evitare.
Saad Farooq,

3
Sì .. anche io sono d'accordo sull'evitarlo ... questo è stato per coloro che vogliono invocare anche NewIntent da onCreate.
Pawan Maheshwari,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.