Android singleTask ou modo de inicialização singleInstance? [fechadas]

84

Tenho um aplicativo que tem uma lista como atividade principal e, em seguida, você pode clicar em itens que abre uma visão detalhada desse item. Eu também tenho uma atividade de pesquisa que é semelhante à atividade principal e funciona conforme planejado.

No entanto, quero que essa atividade de pesquisa tenha apenas uma instância na pilha para que os usuários possam pesquisar várias vezes e clicar em voltar os retornará à visualização anterior em que estavam antes de iniciar a pesquisa (em vez de voltar aos resultados da pesquisa anterior)

O modo de inicialização singleTask e singelInstance parece fazer o que eu quero, então não tenho certeza de qual devo usar para esse propósito e por quê?

Kman
fonte

Respostas:

141

Na página Fundamentos do aplicativo do guia do desenvolvedor Android:

Por padrão, todas as atividades em um aplicativo têm afinidade entre si - ou seja, há uma preferência de que todas pertençam à mesma tarefa.

Uma atividade "singleInstance" permanece sozinha como a única atividade em sua tarefa. Se ele iniciar outra atividade, essa atividade será iniciada em uma tarefa diferente, independentemente de seu modo de inicialização - como se FLAG_ACTIVITY_NEW_TASK estivesse no intent. Em todos os outros aspectos, o modo "singleInstance" é idêntico a "singleTask".

Conforme observado acima, nunca há mais de uma instância de uma atividade "singleTask" ou "singleInstance", portanto, espera-se que essa instância trate de todas as novas intents. Uma atividade "singleInstance" está sempre no topo da pilha (visto que é a única atividade na tarefa), portanto, está sempre em posição de lidar com a intenção. No entanto, uma atividade "singleTask" pode ou não ter outras atividades acima dela na pilha. Em caso afirmativo, ele não está em posição de lidar com a intenção e a intenção é descartada. (Mesmo que a intenção seja descartada, sua chegada faria com que a tarefa fosse para o primeiro plano, onde permaneceria.)

4 atividades em uma tarefa

Como nunca há mais de uma instância da Activity em qualquer um dos modos de inicialização, o botão Voltar sempre o levará para a instância existente da Activity em seu caso.

Uma diferença importante é que "singleTask" não requer a criação de uma nova tarefa para as novas Activities que estão sendo iniciadas quando algo é selecionado. Nem terá que remover essa nova tarefa no botão Voltar a cada vez.

Uma vez que sua pilha de atividades pertence a uma "tarefa" de usuário, e não parece que você tem uma estrutura Intent intrincada onde singleInstance pode ser benéfico para sempre lidar com eles, eu sugeriria usar o modo de inicialização singleTask.

Aqui está uma boa postagem de blog para mais informações, bem como creditado pela imagem: Android Activities and Tasks series - Uma introdução ao modelo de componente de IU do Android

Guzba
fonte
4
Obrigado! parece uma boa leitura ... a coisa é iv percebi que eu realmente QUERO várias instâncias de uma atividade e somente quando a atividade de primeiro plano é uma atividade de pesquisa e outra pesquisa é realizada deve usar essa atividade existente (como como funciona o mercado) pois o singeTop é exatamente o que estou procurando, mas obrigado pela ajuda de qualquer maneira =) obrigado
Kman
1
Ei, obrigado. Este post bem escrito me ajudou em uma pitada.
icecreamman
Obrigado pelos detalhes, especialmente este (mesmo que a intenção seja descartada, sua chegada faria com que a tarefa viesse para o primeiro plano, onde permaneceria.) , O que imediatamente limpa minha confusão. Eu estava pensando sobre o que aconteceria se uma única Atividade de tarefa não estivesse no topo da pilha enquanto eu ainda desejasse navegar até ela sem especificar FLAG_ACTIVITY_CLEAR_TOP .
neevek
30

De uma forma simples-

singleTask:

O sistema cria uma nova tarefa e instancia a atividade na raiz da nova tarefa. No entanto, se uma instância da atividade já existir em uma tarefa separada, o sistema roteia o intent para a instância existente por meio de uma chamada para seu onNewIntent()método, em vez de criar uma nova instância. Apenas one instanceda atividade pode existir por vez.

Nota: Embora a atividade comece em uma nova tarefa, o botão Voltar ainda retorna o usuário à atividade anterior.

instância única-

O mesmo que "singleTask", exceto que o sistema não inicia nenhuma outra atividade na tarefa que contém a instância . A atividade é sempre o único e único membro de sua tarefa; quaisquer atividades iniciadas por este abrem em uma tarefa separada .

Tarun Varshney
fonte
4

singleTaske as singleInstanceatividades podem apenas iniciar uma tarefa. Eles estão sempre na raiz da pilha de atividades. Além disso, o dispositivo pode conter apenas uma instância da atividade por vez - apenas uma dessas tarefas.
para mais android: launchMode .

Rupesh Yadav
fonte
1
a última frase é verdadeira para instância única, não tarefa única
Serdar Samancıoğlu
@SerdarS. aprecio seu comentário. Adicionando mais sobre singleTask- O sistema cria uma nova tarefa e instancia a atividade na raiz da nova tarefa. No entanto, se uma instância da atividade já existir em uma tarefa separada, o sistema roteia o intent para a instância existente por meio de uma chamada para seu onNewIntent()método, em vez de criar uma nova instância. Apenas uma instância da atividade pode existir por vez. para mais developer.android.com
Rupesh Yadav
Entendi, então eu estava errado. Desculpe incomodar.
Serdar Samancıoğlu