Universidade Federal do Paraná Departamento de Informática Ciência da Computação Tópicos em Computação Android Ciclo de vida activities, tasks, modelo de navegação Prof. Eduardo Todt 2018
objetivos Conhecer melhor Intents Conhecer modelo de navegação do sistema Entender ciclo de vida de uma app Entender ciclo de vida de uma activity Entender stack de activities e tasks Explorar Navigation architecture component
Android tasks and back stack http://developer.android.com
Android navigation model Usuário move de activity em activity Botão <back> remove atual e mostra a anterior no topo da pilha Task é um conjunto de activities, por ex. Ler email responder email. Task pode usar activities de outras app, como por ex. Leitor de código de barras
Android navigation model Em geral activities são iniciadas por Intents Nova task marca uma activity como NEW_TASK Com NEW_TASK, atividades subsequentes na pilha fazem parte desta task, até que ocorra outra NEW_TASK A activity main (categoria LAUNCHER) de uma app é marcada NEW_TASK
System Level Navigation Home OS volta pilha de atividades até chegar na activiy home No boot, home activity deve estar no topo da pilha
System Level Navigation Back Remove atividade atual e volta para a próxima atividade na pilha Apps podem alterar este comportamento (cuidado!) Fecha janelas flutuantes (diálogos, popouts) Encerra action bars contextuais e remove highlight de itens selecionados Fecha teclado on-screen https://developer.android.com/design/patterns/navigation.html
System Level Navigation Recents Orientado a tasks, não atividades Ao selecionar uma task do menu recents, o conjunto de atividades é movido para o topo da pilha seguido da activity home
System Level Navigation Notifications Abrir activity por notificação é similar ao uso de recent Se activity não está na pilha uma instância é criada Se activity está na pilha, é colocado o conjunto de activities da task no topo da pilha junto com a activity home; então todas activities da task são retiradas até chegar na alvo
Application level navigation BACK Navega em ordem cronológica inversa das telas UP (action bars, Android >= 3.0) Navega em uma app baseado na hierarquia entre telas http://developer.android.com
Application level navigation Telas com múltiplos entry points ou telas irmãs não criam history (ex: Gmail) http://developer.android.com
Application level navigation Vistas detalhadas relacionadas criam histórico (ex. Apps do mesmo desenvolvedor no Google Play Store) http://developer.android.com
Application level navigation BACK vs UP https://developer.android.com/design/patterns/navigation.html
Application level navigation BACK vs UP gmail Novas tasks são sempre filhas da home Leitura recomendada: https://developer.android.com/training/design-navigation/
Application level navigation Navegação Horizontal Activities irmãs Tipo: Multi telas com seleção por botões
Application level navigation Navegação Horizontal Activities irmãs Tipo: Navegação em uma única tela: spinner http:// developer.android.com
Application level navigation Navegação Horizontal Activities irmãs Tipo: Navegação em uma única tela: tabs ActionBar.Tab Obsoleto Deprecated in API21 http://www.androidhive.info
Toolbar Toolbar ActionBar.Tab Obsoleto Deprecated in API21 Generalização da action bar https://developer.android.com/reference/android/widget/ Toolbar.html http://www.tutorialsbuzz.com/2015/04/android-lollipop-toolbarexample.html
Application level navigation Navegação Horizontal https://material.io/design/components/navigation-drawer.html#usage Tipo: Navegação em uma única tela: navigation drawer Nav drawer é transiente https://developer.android.com
Nav drawer class MainActivity : AppCompatActivity() { override fun oncreate(savedinstancestate: Bundle?) { super.oncreate(savedinstancestate) setcontentview(r.layout.activity_main) val toolbar: Toolbar = findviewbyid(r.id.toolbar) setsupportactionbar(toolbar)... } } <android.support.v7.widget.toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionbarsize"
Application level navigation Navegação Horizontal Activities irmãs Tipo: Navegação em uma única tela: swipe views http://developer.android.com
Ciclo de vida app Prioridade da aplicação é a prioridade mais alta de seus componentes Ordem de escolha para eliminar app 1. Prioridades mais baixas 2. Maior antiguidade Aplicações ligadas herdam maior prioridade (ex. content provider) Meier 2012
Ciclo de vida app Active processes (foreground) Activities no estado active Broadcast receivers executando onreceive event handler Services executando onstart, oncreate ou ondestroy event handlers Serviços em execução marcados para exec em foreground
Ciclo de vida app Visible processes Visíveis mas inativos hospedando activities visíveis mas não no foreground nem respondendo a eventos do usuário Started Service processes Processos hospedando serviços iniciados que não interagem com usuário. Apps com serviços em execução ainda são consideradas processos foregound. Se OS matar um serviço em exec quando houver recursos ele será re-iniciado, a menos que especificado em contrário
Ciclo de vida app Background processes (stopped) Processos hospedando activities não visíveis e que não possuem serviços executando. Grande número de processos em backgound eleitos para serem eliminados. No Android background não executa... Empty processes Manutenção dos processos na memória para acelerar novo start de apps
Activity lifecycle Active Activity no topo da pilha Visível, com foco e foreground Recebe entradas usuário OS tenta mantê-la viva a todo custo Se outra activity se torna ativa, esta é pausada
Activity lifecycle Paused Activity visível mas sem foco Outra transparente ou non full screen ocupou estado de ativa Tratada como ativa, mas não recebe eventos usuário Se totalmente oculta então é stopped
Activity lifecycle Stopped (background) Activity não visível Permanece em memória Mantém info estado Candidata a terminar se necessário liberar recursos Se sair ou fechar se torna inativa
Activity lifecycle Inactive Activity é inactive depois de eliminada e antes de ser lançada Removidas da pilha Precisam ser reiniciadas antes de serem visualizadas e utilizadas
Activity lifecycle Step pyramid Estados transientes callback methods <activity android:name=".mainactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> http://developer.android.com
Activity lifecycle Step pyramid @Override public void ondestroy() { super.ondestroy(); // Always call the superclass } // Stop method tracing that the activity started during oncreate() android.os.debug.stopmethodtracing(); http://developer.android.com
Activity lifecycle Step pyramid Indo para paused, já libera recursos Override public void onpause() { super.onpause(); // Always call the superclass method first } // Release the Camera because we don't need it when paused // and other activities might need to use it. if (mcamera!= null) { mcamera.release() mcamera = null; } http://developer.android.com
Activity lifecycle Step pyramid Resume inicializa recursos @Override public void onresume() { super.onresume(); // Always call the superclass method first } // Get the Camera instance as the activity achieves full user focus if (mcamera == null) { initializecamera(); // Local method to handle camera init } http://developer.android.com
Activity lifecycle Step pyramid finish( ) http://developer.android.com
Activity lifecycle Não há diferença para usuário entre activity movendo de paused, stopped ou inactive para active Importante salvar toda info de estado e UI quando activity é pausada ou parada
oncreate() oncreate() é overrided em todas activities Chamada pelo OS quanto a activity é criada pela primeira vez Setup estático: criar views, ligar dados a listas,... Inicializa UI e objetos de dados SavedInstanceState tem estado prévio, pode recuperá-lo Sempre seguido de onstart() Necessário chamar a superclasse dela Contém código necessário para iniciar activity Falta gera exceção
onstart() Chamada quando uma activity está se tornando visível Seguido de onresume() se foreground ou onstop() se hidden Inicia animações de UI, audio
onrestart() Chamada depois que activity foi parada, antes de ser iniciada novamente Seguido de onresume() se activity vai para foreground ou onstop() se hidden para usuário
onresume() Chamada quando activity inicia interação com usuário Lugar para reiniciar animações, atualizar UI, reiniciar preview de camera, áudio e vídeo Neste momento activity está no topo da activity stack Seguida de onpause()
onpause() Chamada quando sistema está prestes a retomar uma activity prévia, activit preparando para entrar em backgoround Commit mudanças para dados persistentes Parar animações, audios e outras coisas que consomem CPU Próxima activity não retoma enquanto este método callback não retorna Seguido de
onstop() Chamado quando activity não é mais visível ao usuário, devido a outra ter retomado Momento adequado para salvar dados Seguido de onrestart() se a activity retorna para interagir com usuário ou ondestroy() se descontinuada
ondestroy() Último método antes de destruir activity Provocado por chamada a finish() na activity ou por o OS estar destruindo-a temporariamente para liberar recursos Se activity inclui processos em background, destruição pode levar a memory leak se recursos não forem liberados e processos parados
The navigation architecture component https://developer.android.com/topic/libraries/ architecture/navigation/ 6 Destinos 5 Ações Navigation graph
Projeto com navegação Before you can create a navigation graph, you must set up the Navigation Architecture Component for your project. To set up your project in Android Studio, perform the following steps. If using a Beta, Release Candidate, or Stable build, you must enable the Navigation Editor. Click File > Settings (Android Studio > Preferences on Mac), select the Experimental category in the left pane, check Enable Navigation Editor, and then restart Android Studio. Add the following Navigation Architecture Component to your app or module's build.gradle file. For more information on adding Archtecture Components to build.gradle, refer to Adding components to your project. In the Project window, right-click on the res directory and select New > Android Resource File. The New Resource File dialog appears. Type a name in the File name field, such as "nav_graph". Select Navigation from the Resource type drop-down list. Click OK. The following occurs: A navigation resource directory is created within the res directory. A nav_graph.xml file is created within the navigation directory. The nav_graph.xml file opens in the Navigation Editor. This xml file contains your navigation graph. https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing
Editor de Navegação Navigation editor
Tarefa Vá para o link do navigation editor Estude material apresentado Proponha e implemente app com grafo de navegação
Referências Exemplos, listagens, conceitos, imagens, obtidos do livro do Peter Meier (Professional Android 4 Application Development), do livro Deitel (Android 6 for Programmers), do site www.developer.android.com, do fórum www.stackoverflow.com, e de outras fontes, quando indicado.