sábado, 27 de julho de 2013

Parando e Reiniciando uma Ação

Apropriadamente parar ou reiniciar sua ação é um processo importante dentro da vida útil da ação que assegura que os usuários notem que seu aplicativo está ativo e não perdeu o progresso. Existem alguns cenários chaves em que sua ação será parada e reiniciada:

·         O usuário abre a janela Aplicativos Recentes e muda do seu aplicativo para outro aplicativo, a ação em seu aplicativo está atualmente em primeiro plano é parada. Se o usuário retornar para sua aplicação pelo ícone de na tela inicial ou pela janela de Aplicativos Recentes, a ação reinicia.
·         O usuário realiza uma atividade em seu aplicativo que começa uma nova ação. A ação atual é parada quando a segunda ação é criada. Se o usuário então pressiona o botão Voltar, a primeira ação é reiniciada.
·         O usuário recebe uma chamada de telefone enquanto usa seu aplicativo.

A classe  Ação fornece dois métodos de vida útil, onStop() e onRestart(), que permitem a você especificamente manipular como sua ação faz o tratamento para ser parada e reiniciada. Diferente do estado suspenso, no qual identifica uma obstrução parcial na interface com o usuário, o estado Parado garante que a interface não está mais visível e que o foco do usuário está em uma ação separada (ou um aplicativo totalmente a parte).

Nota: Uma vez que o sistema mantém sua instancia de Ação na memória do sistema quando este é parado, é impossível que você não precise programar os métodos onStop() e onRestart() (ou  até mesmo onStart()). Para a maioria das ações que são relativamente simples, a ação irá parar e reiniciar de forma tão suave como se você usa-se somente onPause() para suspender as ações atuais e desconecta-las dos recursos do sistema.
Figura. Quando o usuário deixa a sua ação, o sistema chama onStop() para parar sua ação (1). Se o usuário retornar enquanto a ação está parada, o sistema chama  onRestart() (2), rapidamente seguida por onStart() (3) e onResume() (4). Repare que não importa o qual cenário faz a ação parar, o sistema sempre chama onPause() antes de chamar onStop().

Parando Sua Ação


Quando sua ação recebe uma chamada para o método onStop() , não está mais visível e deve liberar a maioria dos recursos dos quais não precisa enquanto o usuário não está usando. Uma vez que sua ação é parada, o sistema pode destruir a instancia se precisar recuperar a memória do sistema. Em casos extremos, o sistema simplesmente mata seu aplicativo sem executar a ação final com a chamada de onDestroy(), então é importante que você use onStop() para liberar recursos que gerem um vazamento de memória.
Mesmo que o método onPause() seja chamado antes de onStop() para realizar maiores e mais intensivas operações de desligamento no processador, tais como escritas de informações no banco de dados.
Por exemplo, aqui está uma implementação de onStop() que salva o conteúdo de uma anotação no armazenamento permanente:

@Override
protected void onStop() {
 
super.onStop();  // Always call the superclass method first

 
// Save the note's current draft, because the activity is stopping
 
// and we want to be sure the current note progress isn't lost.
 
ContentValues values = new ContentValues();
 values
.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
 values
.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

 getContentResolver
().update(
  mUri
,    // The URI for the note to update.
  values
,  // The map of column names and new values to apply to them.
 
null,    // No SELECT criteria are used.
 
null     // No WHERE columns are used.
 );
}
Quando a sua ação é parada, o objeto Ação é mantido residente na memória e é novamente chamado quando a ação retoma. Você não precisa reinicializar os componentes que criou durante qualquer chamada de métodos que o levou ao estado Retomado. O sistema também mantém rastreado o atual estado para cada View que esteja no esboço, assim, caso o usuário entre um texto no elemento gráfico EditText, o conteúdo é mantido e você não precisará salvá-lo para restaurar.
Nota: Mesmo que o sistema destrua a sua ação enquanto é parada, ainda se mantém no estado do objeto View ( tais como o texto em EditText) dentro do Bundle (uma quantidade mínima de valores chaves) e os restaura para que o usuário consiga então navegar de volta para a mesma instancia da ação (a próxima postagem explicara mais sobre usar Bundle para salvar o outro estado dos dados em caso de sua ação ser destruída e recriada).
Iniciar/Reiniciar Sua Ação


Quando sua ação retorna para o primeiro plano de um estado parado, este recebe a chamada de onRestart(). O sistema chama o método onStart(), que acontece cada vez que sua ação se torna visível(tendo sido reiniciada ou criada pela primeira vez). O método onRestart(), de qualquer forma, somente é chamado quando sua ação retoma de um estado parado, portanto você pode usar para realizar trabalhos de restaurações especiais que podem ser necessários somente se sua ação foi previamente parada, mas não destruída.
È incomum que seu aplicativo precise usar onRestart() para restaurar o estado da ação, portanto não existem instruções para este método que se aplique a população geral dos aplicativos.  Entretanto, uma vez que o método onStop()deva ser essencialmente limpo de todos os recursos da ação, você precisa reinstanciar quando sua atividade retorna. Ainda, você também precisa instanciar ele quando sua ação for criada pela primeira vez (quando não existe instancia da ação). Por esta razão, você deve normalmente usar a chamada de método onStart() como contraparte para o método onStop(), sendo que o que sistema chama onStart() tanto quando cria sua ação como quando reinicia sua ação de um estado parado.
Por exemplo, devido ao usuário estar afastado do seu aplicativo por grande período de tempo antes de retornar, o método onStart() é um bom lugar para verificar se as características do sistema estejam habilitadas:
@Override
protected void onStart() {
super.onStart();  // Always call the superclass method first
   
// The activity is either being restarted or started for the first time
// so this is where we should make sure that GPS is enabled
   
LocationManager locationManager =
           
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
   
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
   
   
if (!gpsEnabled) {
       
// Create a dialog here that requests
       
// the user to enable GPS, and use an intent with the
       
// android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS
       
// action to take the user to the Settings screen
       
// to enable GPS when they click "OK"
   
}
}

@Override
protected void onRestart() {
   
super.onRestart();  // Always call the superclass method first
   
   
// Activity being restarted from stopped state    
}


Quando o sistema destrói a sua atividade, chama o método onDestroy() para sua  Ação. Pela razão de você geralmente precisar liberar a maioria dos recursos com onStop(), no momento em que você receber a chamada para onDestroy(), não existe muito do que a maioria dos aplicativos precise. Este método é sua ultima chance de limpar todos os recursos para podem levar a um vazamento de memória, então você deve ter certeza que tarefas adicionais são destruídas e outras longas atividades como o método para delineamento do esboço são encerrados.

quarta-feira, 24 de julho de 2013

Suspendendo e Retomando uma Ação


Durante o uso normal de uma aplicação, o primeiro plano da ação ocasionalmente será obstruído por outros componentes visuais que obrigam a ação ser suspensa. Por exemplo, quando uma ação semitransparente abre (tais como as que definem o estilo da interface gráfica), a ação anterior será suspensa. Enquanto a ação estiver parcialmente visível, mas não com o foco atualmente ativo, se manterá suspensa.
De qualquer forma, uma vez que ação estiver totalmente obstruída e não visível, irá parar (será discutido na próxima postagem).
Assim que sua ação estiver no estado suspenso, o sistema chama o método onPause() na sua Ação, que lhe permitira parar atividades que não devem continuar suspensas (tais como vídeo) ou persistir qualquer informação que deve ser permanentemente salva em caso do usuário continuar a abandonar o aplicativo, se o usuário retorna sua ação de um estado suspenso, o sistema retoma e chama o método onResume().
Nota: Quando sua ação recebe uma chamada para onPause(), pode ser uma indicação de que sua ação será suspensa por um momento e o usuário pode retornar o foco para sua ação. De qualquer forma, costuma ser a primeira indicação de que o usuário está deixando sua ação.

Figura. Quando uma ação semitransparente obscurece sua ação, o sistema chama onPause() e a ação aguardo no estado Suspenso (1). Se o usuário retorna a ação quando ainda está suspenso, o sistema chama onResume() (2).
Suspendendo Sua Ação


Quando o sistema chama onPause() para sua ação, tecnicamente significa que sua ação está parcialmente visível, mas na maioria dos casos é uma indicação de que o usuário está deixando sua ação e de que em breve ira para o estado Parado. Você deve normalmente usar a chamada de onPause() para:
·         Para animações ou outras atividades que podem consumir processamento,
·         Armazenar mudanças não salvas, mas somente se o usuário espera que tais mudanças sejam permanentemente salvas quando ele sai (tais como rascunho de email).
·         Liberar recursos do sistema, tais como receptores de radiodifusão, tratamento de sensores (como GPS), ou qualquer recurso que possa afetar a vida da bateria enquanto sua ação estiver suspensa e o usuário não precisa dela.

Por exemplo, se sua aplicação utilize a Camera, o método onPause() é um bom local para libera-lo.
@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;
   
}
}

Geralmente, você não deve usar onPause() para armazenar mudanças do usuário (tais como informações pessoais adicionada em um formulário) de forma permanente. A única vez em que você deve manter as alterações do usuário em um armazenamento permanente utilizando onPause() é quando você tem certeza de que o usuário espera que as mudanças tenham salvamento automático (tais como quando escreve uma mensagem). De qualquer forma, você deve evitar realizar trabalhos de processamento intensivo no processador durante onPause(), tais como escrever no bando de dados, por que pode atrasar a transição visível para a próxima ação ( você deve realizar operações finais de processamento pesado durante onStop()).
Você deve manter o total de operações feitas no método onPause() relativamente simples em ordem de permitir uma rápida transição para o próximo destino do usuário caso sua ação esteja sendo parada.
Nota: Quando sua ação é suspensa, a instância da Ação é mantida na memória e é novamente chamada quando a ação retoma. Você não precisa reinicializar componentes que foram criados durante a chamada dos métodos que levaram para o estado Retomado.
Retomando Sua Ação


Quando o usuário retoma sua ação de um estado Suspenso, o sistema chama o método onResume().
Esteja consciente de que o sistema chama este método cada vez que sua ação vier para o primeiro plano, inclusive quando é criado pela primeira vez. Assim sendo, você deve programar onResume() para inicializar componentes que você irá liberar durante onPause() e realizar quaisquer inicializações que deve ocorrer a cada vez que a ação entrar no estado Retomado (tais como inicio de animações e inicializar componentes somente usados enquanto a ação tem o foco do usuário).
O seguinte exemplo de onResume() é a contra parte do exemplo de onPause() visto acima, inicializa a câmera e libera quando a ação for suspensa.

@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
   
}
}