| page.title=Tarefas e pilhas de retorno |
| parent.title=Atividades |
| parent.link=activities.html |
| @jd:body |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| |
| <h2>Neste documento</h2> |
| <ol> |
| <li><a href="#ActivityState">Gravação do estado da atividade</a></li></li> |
| <li><a href="#ManagingTasks">Gerenciamento de tarefas</a> |
| <ol> |
| <li><a href="#TaskLaunchModes">Definição de modos de inicialização</a></li> |
| <li><a href="#Affinities">Tratamento de afinidades</a></li> |
| <li><a href="#Clearing">Apagar a pilha de retorno</a></li> |
| <li><a href="#Starting">Início de uma tarefa</a></li> |
| </ol> |
| </li> |
| </ol> |
| |
| <h2>Artigos</h2> |
| <ol> |
| <li><a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html"> |
| Multitarefa do modo Android</a></li> |
| </ol> |
| |
| <h2>Veja também</h2> |
| <ol> |
| <li><a href="{@docRoot}design/patterns/navigation.html">Projeto para Android: |
| Navegação</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html">Elemento de manifesto |
| {@code <activity>}</a></li> |
| <li><a href="{@docRoot}guide/components/recents.html">Tela de visão geral</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| |
| <p>Os aplicativos normalmente contêm diversas <a href="{@docRoot}guide/components/activities.html">atividades</a>. Cada atividade |
| deve ser projetada com relação a tipos específicos de ações que o usuário pode realizar e que podem iniciar outras |
| atividades. Por exemplo: um aplicativo de e-mail pode ter uma atividade para exibir uma lista de novas mensagens. |
| Quando o usuário seleciona uma mensagem, uma nova atividade abre para exibir essa mensagem.</p> |
| |
| <p>As atividades podem também iniciar atividades existentes em outros aplicativos no dispositivo. Por |
| exemplo: se o seu aplicativo deseja enviar um e-mail, é possível definir uma intenção para realizar |
| uma ação de "enviar" e incluir alguns dados, como um endereço de e-mail e uma mensagem. Uma atividade de outro |
| aplicativo que se declara para tratar deste tipo de intenções, então, abre-se. Nesse caso, a intenção |
| destina-se ao envio de e-mails, portanto inicia-se uma atividade de “composição" do aplicativo de e-mail (se diversas atividades |
| forem compatíveis com a mesma intenção, o sistema permitirá que o usuário selecione qual usar). Quando o e-mail é |
| enviado, sua atividade reinicia, parecendo que a atividade de e-mail faz parte do seu aplicativo. Apesar |
| de as atividades serem de aplicativos diferentes, o Android mantém essa experiência |
| do usuário retilínea mantendo ambas as atividades na mesma <em>tarefa</em>.</p> |
| |
| <p>Tarefas são coleções de atividades com as quais os usuários interagem |
| ao realizar determinado trabalho. As atividades são organizadas em uma pilha (a <em>pilha de retorno</em>) |
| na ordem em que cada atividade é aberta.</p> |
| |
| <!-- SAVE FOR WHEN THE FRAGMENT DOC IS ADDED |
| <div class="sidebox-wrapper"> |
| <div class="sidebox"> |
| <h3>Adding fragments to a task's back stack</h3> |
| |
| <p>Your activity can also include {@link android.app.Fragment}s to the back stack. For example, |
| suppose you have a two-pane layout using fragments, one of which is a list view (fragment A) and the |
| other being a layout to display an item from the list (fragment B). When the user selects an item |
| from the list, fragment B is replaced by a new fragment (fragment C). In this case, it might be |
| desireable for the user to navigate back to reveal fragment B, using the <em>Back</em> button.</p> |
| <p>In order to add fragment B to the back stack so that this is possible, you must call {@link |
| android.app.FragmentTransaction#addToBackStack addToBackStack()} before you {@link |
| android.app.FragmentTransaction#commit()} the transaction that replaces fragment B with fragment |
| C.</p> |
| <p>For more information about using fragments and adding them to the back stack, see the {@link |
| android.app.Fragment} class documentation.</p> |
| |
| </div> |
| </div> |
| --> |
| |
| <p>A tela inicial do dispositivo é o ponto de partida para a maioria das tarefas. Quando o usuário toca em um ícone no inicializador do |
| aplicativo |
| (ou em um atalho na tela inicial), essa tarefa do aplicativo acontece em primeiro plano. Se não |
| existir nenhuma tarefa para o aplicativo (se o aplicativo não tiver sido usado recentemente), uma nova tarefa |
| será criada e a atividade "principal" daquele aplicativo abrirá como a atividade raiz na pilha.</p> |
| |
| <p>Quando a atividade atual inicia outra, a nova atividade é colocada no topo da pilha |
| e recebe foco. A atividade anterior permanece na pilha, mas é interrompida. Quando uma atividade |
| para, o sistema retém o estado atual da interface do usuário. Quando o usuário pressiona o botão |
| <em>Voltar</em> |
| , a atividade atual é retirada do topo da pilha (a atividade é destruída) |
| e a atividade anterior reinicia (o estado anterior da IU é restaurado). Atividades na pilha nunca |
| são reorganizadas, somente colocadas e retiradas da pilha — colocadas na pilha quando iniciadas |
| pela atividade atual e retiradas quando o usuário se retira dela usando o botão <em>Voltar</em>. Desse modo, a pilha |
| de retorno |
| opera como uma estrutura de objeto UEPS (último que entra, primeiro que sai). A figura 1 |
| ilustra esse comportamento com uma linha cronológica exibindo o progresso entre atividades junto com a pilha de retorno |
| atual em cada ponto no tempo.</p> |
| |
| <img src="{@docRoot}images/fundamentals/diagram_backstack.png" alt="" /> |
| <p class="img-caption"><strong>Figura 1.</strong> Representação de como cada nova atividade |
| em uma tarefa adiciona um item à pilha de retorno. Quando o usuário pressiona o botão <em>Voltar</em>, |
| a atividade atual é |
| destruída e a atividade anterior reinicia.</p> |
| |
| |
| <p>Se o usuário continua pressionando <em>Voltar</em>, cada atividade na pilha é retirada para |
| revelar |
| a anterior até que o usuário retorne à tela inicial (ou a qualquer atividade que estivesse em execução |
| no começo da tarefa). Quando todas as atividades forem removidas da pilha, a tarefa não existirá mais.</p> |
| |
| <div class="figure" style="width:287px"> |
| <img src="{@docRoot}images/fundamentals/diagram_multitasking.png" alt="" /> <p |
| class="img-caption"><strong>Figura 2.</strong> Duas tarefas: a tarefa B recebe a interação do usuário |
| em primeiro plano enquanto a tarefa A está em segundo plano aguardando para ser retomada.</p> |
| </div> |
| <div class="figure" style="width:215px"> |
| <img src="{@docRoot}images/fundamentals/diagram_multiple_instances.png" alt="" /> <p |
| class="img-caption"><strong>Figura 3.</strong> Uma única atividade é instanciada diversas vezes.</p> |
| </div> |
| |
| <p>As tarefas são unidades coesas que podem mover-se para "segundo plano" quando usuário inicia uma nova tarefa |
| ou ir para a tela inicial por meio do botão <em>Página inicial</em>. Quando em segundo plano, todas as atividades |
| da tarefa são |
| interrompidas, mas a pilha de retorno das tarefas continua intacta — a tarefa simplesmente perdeu o foco, |
| que foi para outra tarefa, como ilustrado na figura 2. Uma tarefa pode, então, retornar ao "primeiro plano" para que os usuários |
| continuem de onde pararam. Suponha, por exemplo, que a tarefa atual (tarefa A) tenha três |
| atividades na sua pilha — duas sob a atividade atual. O usuário pressiona o botão <em>Página inicial</em> e, |
| em seguida, |
| inicia um novo aplicativo no inicializador do aplicativo. Quando a tela inicial aparece, a tarefa A |
| vai para segundo plano. Quando o novo aplicativo inicia, o sistema inicia uma tarefa para este aplicativo |
| (tarefa B) com sua própria pilha de atividades. Após interagir |
| com este aplicativo, o usuário retorna à Página inicial novamente e seleciona o aplicativo que originalmente |
| iniciou a tarefa A. Agora, a tarefa A fica |
| em primeiro plano — todas as três atividades nas pilhas estão intactas e a atividade no topo |
| da pilha reinicia. Nesse |
| momento, o usuário pode alternar para a tarefa B acessando a Página inicial e selecionando o ícone do aplicativo |
| que iniciou essa tarefa (ou selecionando a tarefa do aplicativo |
| na <a href="{@docRoot}guide/components/recents.html">tela de visão geral</a>). |
| Esse é um exemplo de multitarefas no Android.</p> |
| |
| <p class="note"><strong>Observação:</strong> várias tarefas podem ser mantidas em segundo plano simultaneamente. |
| Contudo, se o usuário estiver executando diversas tarefas em segundo plano ao mesmo tempo, o sistema pode começar |
| a destruir atividades de segundo plano para recuperar memória, fazendo com que o estado das atividades seja perdido. |
| Consulte a seção a seguir sobre <a href="#ActivityState">Estado de atividades</a>.</p> |
| |
| <p>Como as atividades na pilha de retorno nunca são reorganizadas, se o seu aplicativo permitir que |
| usuários iniciem uma determinada atividade a partir de mais de uma atividade, uma nova instância |
| dela será criada e colocada na pilha (em vez de trazer qualquer instância anterior |
| dela para o topo). Assim, uma atividade no aplicativo pode ser instanciada diversas |
| vezes (mesmo a partir de diferentes tarefas), como ilustrado na figura 3. Assim, se o usuário navegar inversamente |
| usando o botão <em>Voltar</em>, as instâncias da atividade serão revelada na ordem em que foram |
| abertas (cada uma |
| com o próprio estado da IU). No entanto, é possível modificar esse comportamento se você não deseja que uma atividade seja |
| instanciada mais de uma vez. Esse assunto é abordado na próxima seção sobre <a href="#ManagingTasks">Gerenciamento de tarefas</a>.</p> |
| |
| |
| <p>Para resumir o comportamento padrão de atividades e tarefas:</p> |
| |
| <ul> |
| <li>Quando a atividade A inicia a atividade B, a atividade A é interrompida, mas o sistema retém seu estado |
| (como posição de rolagem e texto inserido em formulários). |
| Se o usuário pressionar o botão <em>Voltar</em> na atividade B, a atividade A reiniciará com seu estado |
| restaurado.</li> |
| <li>Quando o usuário se retira de uma tarefa pressionando o botão <em>Página inicial</em>, a atividade atual é |
| interrompida |
| e sua tarefa fica em segundo plano. O sistema retém o estado de cada atividade na tarefa. Se, |
| mais tarde, o usuário reiniciar a tarefa selecionando o ícone de inicialização que a inicia, ela ficará |
| em primeiro plano e reiniciará a atividade no topo da pilha.</li> |
| <li>Se o usuário pressionar o botão <em>Voltar</em>, a atividade atual será retirada da pilha |
| e |
| destruída. A atividade anterior na pilha é retomada. Quando uma atividade é destruída, o sistema |
| <em>não</em> retém seu estado.</li> |
| <li>As atividades podem ser instanciadas diversas vezes mesmo a partir de outras tarefas.</li> |
| </ul> |
| |
| |
| <div class="note design"> |
| <p><strong>Projeto de navegação</strong></p> |
| <p>Para saber mais sobre o funcionamento da navegação de aplicativos no Android, leia o guia <a href="{@docRoot}design/patterns/navigation.html">Navegação</a> do Projeto do Android.</p> |
| </div> |
| |
| |
| <h2 id="ActivityState">Gravação do estado da atividade</h2> |
| |
| <p>Como discutido acima, o comportamento padrão do sistema preserva o estado de uma atividade quando ela é |
| interrompida. Desse modo, quando usuários navegam inversamente a uma atividade anterior, a interface do usuário aparece |
| na forma em que foi deixada. Entretanto, é possível — e <strong>recomendável</strong> — reter proativamente |
| o estado das atividades usando métodos de retorno de chamada nos casos em que a atividade é destruída e deve |
| ser recriada.</p> |
| |
| <p>Quando o sistema interrompe uma das atividades (como quando uma nova atividade inicia ou a tarefa |
| se move para segundo plano), o sistema pode destruir esta atividade completamente se precisar recuperar |
| a memória do sistema. Quando isso ocorre, as informações sobre o estado da atividade são perdidas. Se isso acontecer, |
| o sistema ainda |
| saberá que a atividade tem um lugar na pilha de retorno, mas quando a atividade for levada |
| ao topo da pilha, o sistema precisará recriá-la (em vez de reiniciá-la). Para |
| evitar perder o trabalho do usuário, deve-se retê-la proativamente implementando |
| métodos de retorno de chamada {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} |
| na atividade.</p> |
| |
| <p>Para obter mais informações sobre a gravação do estado da atividade, consulte o documento |
| <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Atividades</a>.</p> |
| |
| |
| |
| <h2 id="ManagingTasks">Gerenciamento de tarefas</h2> |
| |
| <p>O modo com que o Android gerencia tarefas e a pilha de retorno, como descrito abaixo — posicionando todas |
| as atividades iniciadas em sucessão na mesma tarefa em uma pilha UEPS (último que entra, primeiro que sai) — funciona |
| muito bem para a maioria dos aplicativo e não é preciso preocupar-se com a associação das atividades |
| a tarefas ou como elas estão organizadas na pilha de retorno. No entanto, pode-se decidir interromper |
| o comportamento normal. Talvez você deseje que uma atividade inicie uma nova tarefa no aplicativo ao ser |
| iniciada (em vez de ser colocada dentro da tarefa atual); ou, quando você inicia uma atividade, deseja |
| apresentar uma instância dela existente (em vez de criar uma nova |
| instância no topo da pilha de retorno); ou talvez você deseje que a pilha apague |
| todas as atividades, exceto a atividade raiz, quando o usuário sai da tarefa.</p> |
| |
| <p>É possível fazer tudo isso e muito mais com atributos |
| no elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> do manifesto |
| e com sinalizadores na intenção passada |
| a {@link android.app.Activity#startActivity startActivity()}.</p> |
| |
| <p>Com relação a isso, os principais atributos <a href="{@docRoot}guide/topics/manifest/activity-element.html"> |
| {@code <activity>}</a> que podem ser usados são:</p> |
| |
| <ul class="nolist"> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff"> |
| {@code taskAffinity}</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode"> |
| {@code launchMode}</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent"> |
| {@code allowTaskReparenting}</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#clear"> |
| {@code clearTaskOnLaunch}</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#always"> |
| {@code alwaysRetainTaskState}</a></li> |
| <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#finish"> |
| {@code finishOnTaskLaunch}</a></li> |
| </ul> |
| |
| <p>E os principais sinalizadores de intenção que podem ser usados são:</p> |
| |
| <ul class="nolist"> |
| <li>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</li> |
| <li>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</li> |
| <li>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</li> |
| </ul> |
| |
| <p>Nas seções a seguir, você verá como usar esses atributos de manifesto e sinalizadores |
| de intenção para definir como as atividades são associadas a tarefas e como elas se comportam na pilha de retorno.</p> |
| |
| <p>Além disso, são discutidas separadamente as considerações sobre como tarefas e atividades podem ser representadas |
| e gerenciadas na tela de visão geral. Consulte <a href="{@docRoot}guide/components/recents.html">Tela de visão geral</a> |
| para obter mais informações. Normalmente, é preciso permitir que o sistema defina como as tarefas |
| e as atividades são representadas na tela de visão geral e não é necessário modificar esse comportamento.</p> |
| |
| <p class="caution"><strong>Atenção:</strong> a maioria dos aplicativos não deve interromper o comportamento |
| padrão de atividades e tarefas. Se você determinar que é necessário modificar os comportamentos padrão |
| da atividade, seja prudente e certifique-se de testar a capacidade de uso da atividade durante |
| a inicialização e ao navegar de volta para ela de outras atividades e tarefas com o botão <em>Voltar</em>. |
| Certifique-se de testar os comportamentos de navegação que podem entrar em conflito com o comportamento esperado pelo usuário.</p> |
| |
| |
| <h3 id="TaskLaunchModes">Definição de modos de inicialização</h3> |
| |
| <p>Os modos de inicialização permitem definir a forma com que uma nova instância de uma atividade é associada |
| à tarefa atual. Pode-se definir diferentes modos de inicialização de duas maneiras:</p> |
| <ul class="nolist"> |
| <li><a href="#ManifestForTasks">Usando o arquivo de manifesto</a> |
| <p>Ao declarar uma atividade em um arquivo de manifesto, pode-se especificar como a atividade |
| deve associar-se a tarefas quando ela inicia.</li> |
| <li><a href="#IntentFlagsForTasks">Usando sinalizadores de intenção</a> |
| <p>Ao chamar {@link android.app.Activity#startActivity startActivity()}, |
| é possível incluir um sinalizador na {@link android.content.Intent} que declara como |
| (ou se) a nova atividade deve associar-se à tarefa atual.</p></li> |
| </ul> |
| |
| <p>Assim, se a atividade A iniciar a atividade B, a atividade B poderá definir no manifesto como |
| deve associar-se à tarefa atual (se ocorrer) e a atividade A poderá solicitar o modo pelo qual a atividade |
| B deverá associar-se à tarefa atual. Se ambas as atividades definem como a atividade B |
| deve associar-se a uma tarefa, a solicitação da atividade A (como definido na intenção) sobrepõe |
| a solicitação da atividade B (como definido no seu manifesto).</p> |
| |
| <p class="note"><strong>Observação:</strong> Alguns modos de inicialização disponíveis para o arquivo de manifesto |
| não estão disponíveis como sinalizadores para uma intenção e, do mesmo modo, alguns modos de inicialização disponíveis como sinalizadores |
| de uma intenção não podem ser definidos no manifesto.</p> |
| |
| |
| <h4 id="ManifestForTasks">Uso do arquivo de manifesto</h4> |
| |
| <p>Ao declarar uma atividade no arquivo de manifesto, pode-se especificar como a atividade |
| deve associar-se a tarefas usando o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code |
| launchMode}</a> do elemento |
| <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>.</p> |
| |
| <p>O atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code |
| launchMode}</a> especifica uma instrução sobre como a atividade deve ser inicializada |
| em uma tarefa. Há quatro modos diferentes de inicialização que podem ser designados ao atributo |
| <code><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">launchMode</a></code>: |
| </p> |
| |
| <dl> |
| <dt>{@code "standard"} (o modo padrão)</dt> |
| <dd>Padrão. O sistema cria uma nova instância da atividade na tarefa |
| pela qual foi iniciada e encaminha-lhe a intenção. A atividade pode ser instanciada diversas vezes; |
| cada instância pode pertencer a diferentes tarefas e uma tarefa pode ter diversas instâncias.</dd> |
| <dt>{@code "singleTop"}</dt> |
| <dd>Se uma instância da atividade já existir no topo da tarefa atual, o sistema |
| encaminhará a intenção àquela instância por meio de uma chamada do método {@link |
| android.app.Activity#onNewIntent onNewIntent()} em vez de criar uma nova instância |
| da atividade. A atividade pode ser instanciada diversas vezes; cada instância pode |
| pertencer a diferentes tarefas e uma tarefa pode ter diversas instâncias (mas somente se |
| a atividade no topo da pilha de retorno <em>não</em> for uma instância existente da atividade). |
| <p>Por exemplo: suponhamos que uma pilha de retorno da tarefa consista na atividade raiz A com as atividades B, C e |
| D no topo (a pilha é A-B-C-D, com D no topo). Uma intenção chega de uma atividade de tipo D. |
| Se D for o modo de inicialização {@code "standard"} padrão, uma nova instância da classe será inicializada |
| e a tarefa se tornará A-B-C-D-D. Entretanto, se o modo de inicialização de D for {@code "singleTop"}, a instância existente |
| de D receberá a intenção por {@link |
| android.app.Activity#onNewIntent onNewIntent()} porque ela está no topo da pilha — |
| a pilha permanece A-B-C-D. Contudo, se uma intenção chegar de uma atividade de tipo B, uma nova |
| instância de B será adicionada à pilha, mesmo que o modo de inicialização seja {@code "singleTop"}.</p> |
| <p class="note"><strong>Observação:</strong> quando uma nova instância de uma atividade é criada, |
| o usuário pode pressionar o botão <em>Voltar</em> para retornar à atividade anterior. Porém, quando uma |
| instância |
| existente de uma atividade trata de uma nova intenção, o usuário não pode pressionar o botão <em>Voltar</em> para retornar |
| ao estado |
| da atividade antes que a nova intenção chegue em {@link android.app.Activity#onNewIntent |
| onNewIntent()}.</p> |
| </dd> |
| |
| <dt>{@code "singleTask"}</dt> |
| <dd>O sistema cria uma nova tarefa e instancia a atividade em sua raiz. |
| Entretanto, se uma instância da atividade já existir em uma tarefa separada, o sistema encaminhará |
| a intenção àquela instância por meio de uma chamada do método {@link |
| android.app.Activity#onNewIntent onNewIntent()} em vez de criar uma nova instância. Somente |
| uma instância da atividade pode existir por vez. |
| <p class="note"><strong>Observação:</strong> embora a atividade inicie em uma nova tarefa, o botão |
| <em>Voltar</em> ainda direciona o usuário à atividade anterior.</p></dd> |
| <dt>{@code "singleInstance"}.</dt> |
| <dd>Igual à {@code "singleTask"}, exceto que o sistema não inicializa nenhuma outra atividade |
| na tarefa que contém a instância. A atividade é sempre o único e exclusivo membro de sua tarefa; |
| toda atividade iniciada por ela abre em uma tarefa separada.</dd> |
| </dl> |
| |
| |
| <p>Outro exemplo: o aplicativo Navegador do Android declara que a atividade do navegador da web deve |
| sempre abrir na própria tarefa — especificando o modo de inicialização {@code singleTask} no elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>. |
| Isso significa que, se o aplicativo emite uma |
| intenção para abrir o navegador do Android, sua atividade <em>não</em> é colocada na mesma |
| tarefa do aplicativo. Em vez disso, uma nova tarefa inicia para o navegador ou, se o navegador |
| já possui uma tarefa em execução em segundo plano, essa tarefa é colocada em primeiro plano para tratar a nova |
| intenção.</p> |
| |
| <p>Se uma atividade inicia em uma nova tarefa ou na mesma tarefa que a atividade que |
| a iniciou, o botão <em>Voltar</em> sempre direciona o usuário à atividade anterior. Porém, se você |
| iniciar uma atividade que especifica o modo de inicialização {@code singleTask} e se uma instância |
| dessa atividade existir em uma tarefa de segundo plano, toda a tarefa será colocada em primeiro plano. Nesse |
| momento, a pilha de retorno conterá todas as atividades da tarefa colocada em primeiro plano |
| no topo. A figura 4 ilustra essa situação.</p> |
| |
| <img src="{@docRoot}images/fundamentals/diagram_backstack_singletask_multiactivity.png" alt="" /> |
| <p class="img-caption"><strong>Figura 4.</strong> Representação de como uma atividade |
| com modo de inicialização "singleTask" é adicionada à pilha de retorno. Se a atividade já for parte de uma tarefa |
| de segundo plano com a própria pilha de retorno, toda a pilha também virá |
| para primeiro plano, no topo da tarefa atual.</p> |
| |
| <p>Para obter mais informações sobre o uso de modos de inicialização no arquivo de manifesto, consulte a documentação do elemento |
| <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> |
| , onde o atributo {@code launchMode} e os valores aceitos |
| são discutidos mais aprofundadamente.</p> |
| |
| <p class="note"><strong>Observação:</strong> os comportamentos a especificar para a atividade com o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> |
| podem ser neutralizados por sinalizadores incluídos na intenção que inicia a atividade, conforme abordado |
| na próxima seção.</p> |
| |
| |
| |
| <h4 id="#IntentFlagsForTasks">Uso de sinalizadores de intenção</h4> |
| |
| <p>Ao iniciar uma atividade, é possível modificar a associação padrão de uma atividade à tarefa |
| incluindo sinalizadores na intenção fornecida a {@link |
| android.app.Activity#startActivity startActivity()}. Os sinalizadores que podem ser usados para modificar |
| o comportamento padrão são:</p> |
| |
| <p> |
| <dt>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</dt> |
| <dd>Inicia a atividade em uma nova tarefa. Se uma tarefa já estiver em execução para a atividade que você está |
| iniciando agora, ela será colocada em primeiro plano com o último estado restaurado e a atividade |
| receberá a nova intenção em {@link android.app.Activity#onNewIntent onNewIntent()}. |
| <p>Isso produz o mesmo comportamento que o valor {@code "singleTask"} do <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a>, |
| abordado na seção anterior.</p></dd> |
| <dt>{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}</dt> |
| <dd>Se a atividade iniciada for a atual (no topo da pilha de retorno), |
| a instância existente receberá uma chamada de {@link android.app.Activity#onNewIntent onNewIntent()} |
| em vez de criar uma nova instância da atividade. |
| <p>Isso produz o mesmo comportamento que o valor {@code "singleTop"} do <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> |
| abordado na seção anterior.</p></dd> |
| <dt>{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}</dt> |
| <dd>Se a atividade iniciada já estiver em execução na tarefa atual, em vez |
| de lançar uma nova instância daquela atividade, todas as outras atividades no topo dela serão |
| destruídas e essa intenção será entregue à instância reiniciada da atividade (agora no topo) |
| por {@link android.app.Activity#onNewIntent onNewIntent()}. |
| <p>Não há nenhum valor para o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> |
| que produza esse comportamento.</p> |
| <p>{@code FLAG_ACTIVITY_CLEAR_TOP} é mais usado em conjunto com |
| {@code FLAG_ACTIVITY_NEW_TASK}. |
| Quando usados juntos, estes sinalizadores são o modo de localizar uma atividade existente |
| em outra tarefa e colocá-la em uma posição em que possa responder à intenção. </p> |
| <p class="note"><strong>Observação:</strong> se o modo de inicialização da atividade designada for |
| {@code "standard"}, |
| ela também será removida da pilha e uma nova instância será iniciada em seu lugar para tratar |
| a intenção recebida. Isso se deve ao fato de que uma nova instância é sempre criada para uma nova intenção quando o |
| modo de inicialização é {@code "standard"}. </p> |
| </dd> |
| </dl> |
| |
| |
| |
| |
| |
| <h3 id="Affinities">Tratamento de afinidades</h3> |
| |
| <p>A <em>afinidade</em> indica a que tarefa uma atividade prefere pertencer. Por padrão, todas |
| as atividades do mesmo aplicativo têm afinidade entre si. Assim, por padrão, todas |
| as atividades no mesmo aplicativo preferem estar na mesma tarefa. Contudo, é possível modificar |
| a afinidade padrão de uma atividade. Atividades definidas |
| em aplicativos diferentes podem compartilhar uma afinidade, ou atividades definidas no mesmo aplicativo podem ter |
| diferentes afinidades de tarefa atribuídas.</p> |
| |
| <p>É possível modificar a afinidade de qualquer atividade com o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> |
| do elemento |
| <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>.</p> |
| |
| <p>O atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> |
| recebe um valor de string que deve ser exclusivo do nome do pacote padrão |
| declarado no elemento <a href="{@docRoot}guide/topics/manifest/manifest-element.html"> |
| {@code <manifest>} |
| </a> porque o sistema usa esse nome para identificar a afinidade |
| de tarefa padrão do aplicativo.</p> |
| |
| <p>A afinidade tem relevância em duas circunstâncias:</p> |
| <ul> |
| <li>Quando a intenção que inicializa uma atividade contém |
| o sinalizador |
| {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}. |
| |
| <p>Uma nova atividade é, por padrão, inicializada na tarefa da atividade |
| que chamou {@link android.app.Activity#startActivity startActivity()}. Ela é colocada na mesma |
| pilha de retorno do autor da chamada. Contudo, se a intenção passada a |
| {@link android.app.Activity#startActivity startActivity()} |
| contiver o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} |
| , o sistema procurará uma tarefa diferente para comportar a nova atividade. Na maioria das vezes, é uma nova tarefa. |
| Porém, isso não é obrigatório. Se já houver uma tarefa com a mesma afinidade |
| da nova atividade, ela será inicializada naquela tarefa. Caso contrário, ela iniciará uma nova tarefa.</p> |
| |
| <p>Se esse sinalizador fizer com que uma atividade inicie uma nova tarefa e se o usuário pressionar o botão <em>Página inicial</em> |
| para sair dela, |
| será necessário ter um modo de o usuário navegar de volta à tarefa. Algumas entidades (como |
| o gerenciador de notificação) sempre iniciam atividades em tarefas externas, nunca como parte de si mesmas, por isso |
| elas sempre colocam {@code FLAG_ACTIVITY_NEW_TASK} nas intenções que passam |
| a {@link android.app.Activity#startActivity startActivity()}. |
| Se você tiver uma atividade que possa ser chamada |
| por uma entidade externa que possa usar este sinalizador, certifique-se de que o usuário tenha um modo independente |
| de voltar à tarefa iniciada, como com um ícone de inicialização (a atividade raiz da tarefa |
| tem um filtro de intenções {@link android.content.Intent#CATEGORY_LAUNCHER}; consulte a seção <a href="#Starting">Início de uma tarefa</a> abaixo).</p> |
| </li> |
| |
| <li>Quando uma atividade tem o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent"> |
| {@code allowTaskReparenting}</a> definido como {@code "true"}. |
| <p>Nesse caso, a atividade pode mover-se da tarefa que iniciou para a tarefa afim |
| quando for colocada em primeiro plano.</p> |
| <p>Por exemplo: suponhamos que uma atividade que relate condições do clima em cidades selecionadas seja |
| definida como parte de um aplicativo de viagens. Ela tem a mesma afinidade que outras atividades no mesmo |
| aplicativo (a afinidade padrão do aplicativo) e permite a redefinição da hierarquia com esse atributo. |
| Quando uma das atividades inicia a atividade de notificação de clima, ela inicialmente pertence à mesma |
| tarefa de sua atividade. Porém, quando a tarefa do aplicativo de viagens é colocada em primeiro plano, |
| a atividade de notificação de clima é reatribuída a essa tarefa e exibida dentro dela.</p> |
| </li> |
| </ul> |
| |
| <p class="note"><strong>Dica:</strong> se um arquivo {@code .apk} contiver mais de um "aplicativo" |
| do ponto de vista do usuário, você provavelmente desejará usar o atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a> |
| para designar diferentes afinidades às atividades associadas a cada "aplicativo".</p> |
| |
| |
| |
| <h3 id="Clearing">Apagar a pilha de retorno</h3> |
| |
| <p>Se o usuário sair de uma tarefa por muito tempo, o sistema apagará a tarefa de todas as atividades exceto |
| a da atividade raiz. Quando o usuário retornar à tarefa, somente a atividade raiz será restaurada. |
| O sistema comporta-se dessa maneira porque, após longo tempo de uso, os usuários provavelmente abandonaram |
| o que estavam fazendo antes e são direcionados de volta à tarefa para começar algo novo. </p> |
| |
| <p>Há alguns atributos de atividade que podem ser usados para modificar esse comportamento: </p> |
| |
| <dl> |
| <dt><code><a |
| href="{@docRoot}guide/topics/manifest/activity-element.html#always">alwaysRetainTaskState</a></code> |
| </dt> |
| <dd>Se esse atributo for definido como {@code "true"} na atividade raiz de uma tarefa, |
| o comportamento padrão descrito não acontecerá. |
| A tarefa reterá todas as atividades em sua pilha mesmo após um longo período.</dd> |
| |
| <dt><code><a |
| href="{@docRoot}guide/topics/manifest/activity-element.html#clear">clearTaskOnLaunch</a></code></dt> |
| <dd>Se esse atributo for definido como {@code "true"} na atividade raiz de uma tarefa, |
| a pilha será apagada da atividade raiz sempre que o usuário sair da tarefa |
| e retornar a ela. Em outras palavras, é o oposto de |
| <a href="{@docRoot}guide/topics/manifest/activity-element.html#always"> |
| {@code alwaysRetainTaskState}</a>. O usuário sempre retorna à tarefa |
| no estado inicial, mesmo ao retirar-se da tarefa somente por um momento.</dd> |
| |
| <dt><code><a |
| href="{@docRoot}guide/topics/manifest/activity-element.html#finish">finishOnTaskLaunch</a></code> |
| </dt> |
| <dd>Esse atributo é como <a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">{@code clearTaskOnLaunch}</a>, |
| mas opera |
| em uma única atividade, e não em uma tarefa inteira. Ele também apaga todas as atividades, |
| inclusive a atividade raiz. Quando definido como {@code "true"}, |
| a atividade permanece parte da tarefa somente para a sessão atual. Se o usuário |
| retirar-se e, em seguida, retornar à tarefa, ela não estará mais presente.</dd> |
| </dl> |
| |
| |
| |
| |
| <h3 id="Starting">Início de uma tarefa</h3> |
| |
| <p>É possível configurar uma atividade como ponto de entrada de uma tarefa fornecendo-lhe um filtro de intenções |
| com {@code "android.intent.action.MAIN"} como a ação especificada |
| e {@code "android.intent.category.LAUNCHER"} |
| como a categoria especificada. Por exemplo:</p> |
| |
| <pre> |
| <activity ... > |
| <intent-filter ... > |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| ... |
| </activity> |
| </pre> |
| |
| <p>Um filtro de intenções desse tipo faz com que um ícone e o rótulo |
| da atividade sejam exibidos no inicializador do aplicativo, fornecendo aos usuários um modo de inicializar a atividade |
| e de retornar à tarefa criada a qualquer tempo após sua inicialização. |
| </p> |
| |
| <p>Este segundo recurso é importante: é preciso que os usuários possam sair de uma tarefa e voltar a ela |
| mais tarde usando esse inicializador de atividades. Por isso, os dois <a href="#LaunchModes">modos |
| de inicialização</a> que marcam atividades como sempre iniciando uma tarefa ({@code "singleTask"} e |
| {@code "singleInstance"}) devem ser usados somente quando a atividade tiver um filtro |
| {@link android.content.Intent#ACTION_MAIN} |
| e um {@link android.content.Intent#CATEGORY_LAUNCHER}. Imagine, por exemplo, o que |
| aconteceria se o filtro não estivesse presente: uma intenção inicializaria uma atividade {@code "singleTask"}, iniciando uma |
| nova tarefa, e o usuário perderia algum tempo trabalhando nessa tarefa. O usuário, então, pressiona o botão |
| <em>Página inicial</em>. A tarefa é enviada para segundo plano e não fica mais visível. O usuário não tem como voltar |
| à tarefa porque ela não é representada no inicializador do aplicativo.</p> |
| |
| <p>Para esses casos em que se deseja que o usuário não seja capaz de retornar a uma atividade, defina |
| <a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code finishOnTaskLaunch}</a> |
| do elemento |
| <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> |
| como {@code "true"} (consulte <a href="#Clearing">Apagar a pilha</a>).</p> |
| |
| <p>Veja mais informações sobre a representação e o gerenciamento de atividades |
| na tela de visão geral em <a href="{@docRoot}guide/components/recents.html"> |
| Tela de visão geral</a>.</p> |
| |
| <!-- |
| <h2>Beginner's Path</h2> |
| |
| <p>For more information about how to use intents to |
| activate other application components and publish the intents to which your components |
| respond, continue with the <b><a |
| href="{@docRoot}guide/components/intents-filters.html">Intents and Intent |
| Filters</a></b> document.</p> |
| --> |