Pergunta

Eu li na documentação do Android que, ao definir a propriedade de lançamento da minha atividade como singletop ou adicionando o FLAG_ACTIVITY_SINGLE_TOP bandeira para minha intenção, aquele chamado startActivity(intent) reutilizaria uma única instância de atividade e me daria a intenção no onNewIntent ligue de volta. Eu fiz as duas coisas, e onNewIntent nunca dispara e onCreate incêndio toda vez. Os documentos também dizem que this.getIntent() Retorna a intenção que foi passada pela primeira vez para a atividade quando foi criada pela primeira vez. Dentro onCreate estou ligando getIntent E estou recebendo um novo sempre (estou criando o objeto de intenção em outra atividade e adicionando um extra a ele ... esse extra deve ser o mesmo sempre que se estivesse retornando o mesmo objeto de intenção). Tudo isso me leva a acreditar que minha atividade não está agindo como um "top único", e não entendo o porquê.

Para adicionar alguns antecedentes, caso eu esteja simplesmente perdendo uma etapa necessária, aqui está minha declaração de atividade no manifesto e no código que estou usando para iniciar a atividade. A atividade em si não faz nada que valha a pena mencionar em relação a isso:

In Androidmanifest.xml:

    <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);
        startActivity(i);
Foi útil?

Solução

Você verificou se onDestroy() foi chamado também? Provavelmente é por isso onCreate() é invocado todas as vezes em vez de onNewIntent(), o que só seria chamado se a atividade já existir.

Por exemplo, se você deixar sua atividade através do botão, ela será destruída por padrão. Mas se você subir mais alto na atividade em outras atividades e a partir daí, ligue para o seu ArtistActivity.class novamente vai pular onCreate() e ir diretamente para onNewIntent(), porque a atividade já foi criada e desde que você a definiu como singleTop O Android não criará uma nova instância, mas pegue a que já está por aí.

O que faço para ver o que está acontecendo, implemento funções fictícias para todos os diferentes estados de cada atividade, então sempre agora o que está acontecendo:

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

O mesmo para onRestart(), onStart(), onResume(), onPause(), onDestroy()

Se o acima (por trás do botão) não fosse o seu problema, a implementação desses manequins pelo menos o ajudará a depurar um pouco melhor.

Outras dicas

A resposta aceita não está correta. Se o OnDestroy () fosse chamado anteriormente, então sim, o OnCreate () sempre seria chamado. No entanto, Esta afirmação está errada: "Se você subir mais alto na atividade em outras atividades e a partir daí, ligue para sua artista.

A seção "singletop" de http://developer.android.com/guide/components/tasks-and-back-stack.html Explica claramente como funciona (atenção ao texto em negrito abaixo; também provei isso através da minha própria depuração):

"Por exemplo, suponha que a pilha traseira de uma tarefa consista na atividade raiz A com as atividades B, C e D no topo (A pilha é ABCD; D está no topo). Uma intenção chega para uma atividade do tipo D. Se D tiver o modo de lançamento "padrão" padrão, uma nova instância da classe será iniciada e a pilha se tornará ABCDD. No entanto, se o modo de lançamento de D for "singletop", a instância existente de D recebe a intenção através do OnNewIntent (), porque está na parte superior da pilha - a pilha permanece ABCD. No entanto, Se uma intenção chegar para uma atividade do Tipo B, uma nova instância de B será adicionada à pilha, mesmo que seu modo de lançamento seja "singletop". "

Em outras palavras, iniciar uma atividade através do single_top apenas reutilizará a atividade existente se for já no topo da pilha. Não funcionará se outra atividade nessa mesma tarefa estiver na parte superior (por exemplo, a atividade que está executando o startActivity (single_top)); Uma nova instância será criada.

Aqui estão duas maneiras de consertar isso Para que você obtenha o comportamento Single_top que deseja - cujo objetivo geral é reutilizar uma atividade existente, em vez de criar um novo ...

Primeira maneira (Conforme descrito na seção de comentários da resposta aceita): Você pode adicionar um modo de lançamento de "SingLetask" à sua atividade. Isso forçaria o OnNewIntent () porque o SingLetask significa que só pode haver uma instância de uma atividade específica em uma determinada tarefa. Esta é uma solução um tanto hacky, porque se o seu aplicativo precisar de várias instâncias dessa atividade em uma situação específica (como eu faço para o meu projeto), você estará ferrado.

Segunda Way (melhor):Em vez de flag_activity_single_top, use flag_activity_reorder_to_front. Isso reutilizará a instância de atividade existente, movendo -a para a parte superior da pilha (onNewIntent () será chamada conforme o esperado).

O principal objetivo do flag_activity_single_top é impedir a criação de várias instâncias de uma atividade. Por exemplo, quando essa atividade pode ser iniciada através de uma intenção proveniente de fora da tarefa principal do seu aplicativo. Para alternância interna entre as atividades no meu aplicativo, descobri que FLAG_ACTIVIDE_REODERS_TO_FRONT é geralmente o que eu quero.

Defina esta bandeira para sua intenção:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top