ciclo de vida onNewIntent () e ouvintes registrados

150

Estou usando uma atividade SingleTop para receber intenções de um diálogo de pesquisa via onNewIntent().

O que notei é que onPause()é chamado antes onNewIntent()e depois chama onResume(). Visualmente:

  • diálogo de pesquisa iniciado
  • intenção de pesquisa disparada para a atividade
  • onPause()
  • onNewIntent()
  • onResume()

O problema é que tenho ouvintes registrados onResume()que são removidos onPause(), mas eles são necessários dentro da onNewIntent()chamada. Existe uma maneira padrão de disponibilizar esses ouvintes?

DJayC
fonte

Respostas:

294

onNewIntent()é o ponto de entrada para atividades singleTop que já são executadas em outro lugar da pilha e, portanto, não podem ser chamadas onCreate(). Do ponto de vista do ciclo de vida das atividades, é necessário ligar onPause()antes onNewIntent(). Sugiro que você reescreva sua atividade para não usar esses ouvintes dentro dele onNewIntent(). Por exemplo, na maioria das vezes, meus onNewIntent()métodos se parecem com isso:

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

Com toda a lógica de instalação acontecendo onResume()utilizando getIntent().

Rodja
fonte
@Rodja, por favor, comente sobre este stackoverflow.com/questions/19092631/… também
Desenvolvedor
3
Relacionada com a pergunta original: manter em mente se você mover o código para lidar com a procura Intentem onResume(), sua atividade provavelmente irá tentar executar uma busca cada vez que recomeça, provavelmente não o comportamento desejado.
Tony Chan
1
Rodja diz: Do ponto de vista do ciclo de vida das atividades, é necessário chamar onPause () antes de onNewIntent () o Android não precisar projetá-lo dessa maneira. Sua atividade já passou pelo ciclo de vida para retomar (). Não é necessário que o Android chame onPause () e chame onResume () novamente. Se o aplicativo for reiniciado, o sistema operacional poderá simplesmente chamarNewIntent () e permanecer no estado reiniciado.
Sani Elfishawy
Rodja diz: Do ponto de vista do ciclo de vida das atividades, é necessário chamar onPause () antes de onNewIntent () que o Android não precisava projetá-lo. Sua atividade já passou pelo ciclo de vida para retomar. Se o ato for retomado, eles podem simplesmente chamarNewIntent () e permanecer no resumo. O problema com a sequência do Android é que torna impossível distinguir entre onPause devido à ação do usuário vs onPause devido a uma intenção de segundo plano. Se você deseja atuar no onPause apenas no caso de ação do usuário, você está ferrado, porque não saberá até o futuro por que seguir o onPause ().
Sani Elfishawy 26/06
Um ponto importante a ser observado é que getIntent () ainda retorna o Intent original. Você pode usar setIntent (Intent) para atualizar para o novo Intent.
Linuxjava #
15

Nota: Chamar um método de ciclo de vida de outro não é uma boa prática. No exemplo abaixo, tentei fazer com que seu onNewIntent seja sempre chamado independentemente do seu tipo de atividade.

OnNewIntent () sempre é chamado para atividades singleTop / Task, exceto pela primeira vez em que a atividade é criada. Naquele momento, o onCreate é chamado fornecendo a solução para poucas consultas feitas neste encadeamento.

Você pode invocar onNewIntent sempre colocando-o no método onCreate como

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

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}
Pawan Maheshwari
fonte
59
Geralmente não é uma boa idéia chamar métodos de ciclo de vida diretamente, não? Talvez inofensivo, ou talvez alguma implementação básica de onNewIntent () pressuponha que onPause () já tenha sido chamado? Presumivelmente, é mais seguro encapsular o código do aplicativo em um método que pode ser chamado de ambos os locais.
BernalKC
12
Acordado. Tivemos alguns casos extremos usando essa abordagem. Melhor evitado.
Saad Farooq
3
Sim ... eu também concordo em evitar isso ... isso foi para aqueles que querem invocar o onNewIntent do onCreate também.
Pawan Maheshwari