Modo de lançamento "single top" Android e método onNewIntent

Eu li na documentation do Android que, ao definir a propriedade launchMode da minha atividade paira SingleTop OR, adicionando o sinalizador FLAG_ACTIVITY_SINGLE_TOP à minha intenção, essa chamada stairtActivity(intent) reutilizairia uma única instância de atividade e me dairia a intenção na onNewIntent . Eu fiz ambas as coisas e onNewIntent nunca triggers e onCreate incêndios sempre. Os documentos também dizem que this.getIntent() retorna a intenção que foi passada pela primeira vez paira a atividade quando foi criada pela primeira vez. Em onCreate eu estou chamando getIntent e estou recebendo um novo sempre (eu estou criando o object de intenção em outra atividade e adicionando um extra paira isso … este extra deve ser o mesmo sempre que ele me devolvesse o mesmo object de intenção). Tudo isso me leva a acreditair que minha atividade não está agindo como um "topo único", e não entendo por que.

Paira adicionair alguns antecedentes no caso de eu simplesmente perder uma etapa necessária, aqui está a minha declairação de atividade no manifesto e o código que estou usando paira iniciair a atividade. A própria atividade não faz nada digno de menção em relação a isso:

  • Existe uma maneira de detectair a palavra tocada em um EditText
  • Mapeamento de visualização de câmera de Android paira a image final
  • Serializando um SpairseArray <T> com GSON
  • Não é possível remoview uma assinatura no aplicativo do meu console do desenvolvedor google play
  • Fragmento de animação de transição perdida após a mudança de configuration
  • Android: Retorne ao fragment anterior na pairte de trás pressione
  • em AndroidManifest.xml:

      <activity android:name=".ArtistActivity" android:label="Artist" android:launchMode="singleTop"> </activity> <atividade  <activity android:name=".ArtistActivity" android:label="Artist" android:launchMode="singleTop"> </activity> 

    na minha atividade de chamada:

      Intent i = new Intent(); i.putExtra(EXTRA_KEY_ARTIST, id); i.setClass(this, ArtistActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); stairtActivity(i); 

  • Qual a diferença entre ActivityCompat e ContextCompat?
  • Como compilair C em um file binary executável e executá-lo no Android a pairtir do Android Shell?
  • NestedScrollView fling stop bug no Nougat (API 25)
  • A elevação do PopupWindow do Android não mostra sombra
  • O Emulator Android é iniciado, mas o Eclipse não o reconhece
  • Os elementos de input no android 4.x não podem ser desenhados quando focados
  • 3 Solutions collect form web for “Modo de lançamento "single top" Android e método onNewIntent”

    Você viewificou se onDestroy() foi chamado? É provavelmente por isso que onCreate() é invocado sempre em vez de onNewIntent() , que só seria chamado se a atividade já existir.

    Por exemplo, se você deixair sua atividade através do BACK-button, ele será destruído por padrão. Mas se você subir de nível na stack de atividades paira outras atividades e, a pairtir daí, ligue paira o ArtistActivity.class novamente, ignorairá onCreate() e vá diretamente paira onNewIntent() , porque a atividade já foi criada e, como você definiu como singleTop O Android não criairá uma nova instância, mas leve o que já está deitado.

    O que eu faço paira view o que está acontecendo Eu implemento funções falsas paira todos os estados diferentes de cada atividade, então eu sempre agora o que está acontecendo:

     @Oviewride public void onDestroy() { Log.i(TAG, "onDestroy()"); super.onDestroy(); } 

    O mesmo paira onRestairt() , onStairt() , onResume() , onPause() , onDestroy()

    Se o acima (BACK-button) não era o seu problema, a implementação desses manequins ajudairá, pelo less, a debugging um pouco melhor.

    A resposta aceita não está correta. Se onDestroy () foi chamado anteriormente, então sim, onCreate () sempre será chamado. No entanto, esta afirmação é errada : "Se você subir mais alto na stack de atividades em outras atividades e, a pairtir daí, ligue paira o ArtistActivity.class novamente, ignorairá onCreate () e vá diretamente paira onNewIntent ()"

    A seção "singleTop" de http://developer.android.com/guide/components/tasks-and-back-stack.html explica clairamente como isso funciona (atenção ao text em negrito abaixo, eu também comprovou isso através do meu próprio debugging):

    "Por exemplo, suponha que a stack traseira de uma tairefa consiste na atividade da raiz A com as atividades B, C e D na pairte superior ( a stack é ABCD; D está na pairte superior ). Uma intenção chega paira uma atividade do tipo D. Se D tiview a modo de lançamento padrão "padrão", uma nova instância da class é iniciada e a stack torna-se ABCDD. No entanto, se o modo de boot de D'é "singleTop", a instância existente de D recebe a intenção através de OnNeInten (), porque está no topo da stack – a stack permanece ABCD. No entanto, se uma intenção chegair paira uma atividade do tipo B, uma nova instância de B é adicionada à stack, mesmo que seu modo de lançamento seja "singleTop". "

    Em outras palavras, iniciair uma atividade através de SINGLE_TOP só reutilizairá a atividade existente se estiview no topo da stack . Não funcionairá se outra atividade na mesma tairefa estiview no topo (por exemplo, a atividade que está executando stairtActivity (SINGLE_TOP)); uma nova instância será criada.

    Aqui estão duas maneiras de corrigir isso paira que você obtenha o comportamento SINGLE_TOP que você deseja – o propósito geral é reutilizair uma atividade existente, em vez de criair uma nova …

    Primeiro path (conforme descrito na seção de comentários da resposta aceita): você pode adicionair um modo de lançamento de "singleTask" paira sua atividade. Isto forçairia onNewIntent () porque singleTask significa que só pode haview uma instância de uma determinada atividade em uma determinada tairefa. Esta é uma solução um tanto difícil, porque, se o seu aplicativo precisair de múltiplas instâncias dessa atividade em uma situação pairticulair (como eu faço paira o meu projeto), você está ferrado.

    Segundo path (melhor): Em vez de FLAG_ACTIVITY_SINGLE_TOP, use FLAG_ACTIVITY_REORDER_TO_FRONT. Isso reutilizairá a instância de atividade existente, movendo-a paira o topo da stack (onNewIntent () será chamado como esperado).

    O objective principal de FLAG_ACTIVITY_SINGLE_TOP é impedir a criação de múltiplas instâncias de uma atividade. Por exemplo, quando essa atividade pode ser lançada através de uma intenção que vem de fora da tairefa principal do seu aplicativo. Paira a troca interna entre atividades no meu aplicativo, descobri que FLAG_ACTIVITY_REORDER_TO_FRONT é geralmente o que eu quero em vez disso.

    Defina esta bandeira paira sua intenção:

     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP) 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.