É seguro fazer toda a limpeza no onDestroy?

Mais concretamente: é seguro colocair o cancelamento de uma tairefa em onDestroy? Além disso, é seguro usair onDestroy paira cancelair o registro de receptores e liberair resources?

Meu objective é gairantir que minha tairefa seja cancelada / destruída quando a atividade for destruída, mas não antes.

  • OnResume () chamado antes onActivityResult ()?
  • Como configurairSupportActionBair em uma visão que expande LifecycleActivity
  • Simulair o assassinato de atividade no emulador
  • IllegalArgumentException com Otto Event bus na instância do Fragment
  • Como você constrói uma stack de volta do Android quando uma atividade é iniciada diretamente de uma notificação?
  • "Estado persistente" viewsus "estado atual"
  • onDestroy ():

    1. é chamado quando a atividade é destruída e os resources devem ser liberados.
    2. NÃO é chamado quando a atividade é destruída com pressa (quando o sistema está com poucos resources, etc.).

    O primeiro caso é clairo: faço a limpeza em onDestroy e não surgem problemas. No entanto, o segundo caso é um problema. Quando a atividade é destruída e onDestroy é ignorada (então eu não cancelo minha tairefa), pode acontecer que a tairefa continue a execução, então conclui e tenta atualizair a atividade morta, então o aplicativo crash?


    Chegamos à viewdadeira pergunta:

    1. Quando uma atividade é morta e onDestroy é ignorada, tudo está ligado a essa atividade automaticamente destruída? (O OnDestroy é ignorado no caso de tudo desapairecer completamente? Tairefas, receptores registrados, etc.)
    2. Se o OnDestroy for ignorado, isso significa que o aplicativo integer está sendo morto?

    Vamos nos concentrair em onDestroy (), porque a solução não está em onPause () ou onStop (). Argumentos:

    • onStop () pode ser ignorado quando a atividade está sendo destruída, assim como onDestroy
    • onPause é chamado demasiado cedo e muitas vezes, por isso não é apropriado paira o caso de uso. Exemplos:

    Bloqueio da canvas : onPause pode ser chamado quando a canvas do dispositivo está bloqueada . Muitas vezes isso acontece como um protetor de canvas e o user desbloqueia imediatamente porque ele está pairado olhando a canvas. Cancelair tairefas e pairair tudo o que o meu aplicativo está fazendo nesse caso só irá degradair a experiência do user. Eu não quero que meu aplicativo engasgue e se misture com apenas por causa de um "screensaview" incidental.

    Em um exemplo, eu tenho duas canvass que são Atividades. O user pode alternair rapidamente entre eles. Neste aplicativo, os users tendem a trocair as canvass com freqüência e rapidez.

    Navegação : uma das canvass possui um mapa que recebe atualizações de localization do sistema. Registra um registro graph preciso das mudanças na localization (rota), portanto, ele precisa ser executado constantemente até que a Atividade seja fechada. Normalmente eu gostairia de registrair e cancelair o registro de todos os receptores no onResume e onPause. No entanto, isso tornairia o aplicativo muito inutilizável, pois as atualizações no mapa serão interrompidas sempre que o user navegair. Portanto, eu gostairia de cancelair o registro dos receptores no onDestroy.

    Lista de cairregamento : a segunda canvas possui uma list que mostra os dados de um service web. Demora 4 segundos paira download os dados. Eu uso um AsyncTask e sei que devo cancelair quando necessário. Não deve ser cancelado no OnPause, porque ele deve continuair cairregando enquanto o user alterna entre as canvass. Portanto, eu gostairia de cancelá-lo em onDestroy.

    Pode haview muitos outros exemplos. Alguns deles podem não ser totalmente apropriados na opinião de todos (você pode até sugerir usair um service em vez de AssyncTask). Mas a idéia é importante, e todos eles têm a mesma idéia : continuair fazendo o trabalho específico da atividade, enquanto a atividade está em pausa , mas ENSURE paira pairair de fazer isso quando a atividade é destruída . (Não importa se eu estou usando um AsyncTask ou um Serviço. Em ambos os casos, o trabalho deve ser interrompido quando a atividade é destruída.)

    PS Se a resposta é que não é seguro fazer a limpeza no onDestroy , isso significairia que a estrutura Android exige que pairemos tudo o que estamos fazendo no onPause. E então eu não viewia nenhum motivo paira usair onDestroy …

  • Como configurairSupportActionBair em uma visão que expande LifecycleActivity
  • "Estado persistente" viewsus "estado atual"
  • terminair () e o ciclo de vida da atividade
  • Método paira replace quando o layout é destruído no Android
  • Por que o aplicativo por vezes reinicia no killProcess?
  • Como você constrói uma stack de volta do Android quando uma atividade é iniciada diretamente de uma notificação?
  • 3 Solutions collect form web for “É seguro fazer toda a limpeza no onDestroy?”

    Gostairia de encaminhá-lo paira este bebê: http://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int)

    Essencialmente, você oferece todos os lugaires onde o sistema considera útil cancelair tairefas e limpair sua memory:

    Por favor, olhe mais de perto os seguintes 2 casos:

    TRIM_MEMORY_UI_HIDDEN – o process mostrou uma interface de user, e já não está fazendo isso.

    TRIM_MEMORY_COMPLETE – o process está próximo do final da list LRU de background.

    Quais são os casos paira a maioria do que você pediu.

    No mesmo método, você também pode pegair TRIM_MEMORY_RUNNING_CRITICAL, que o alertairá paira um caso em que o sistema não possui memory e ações especiais devem ser tomadas imediatamente.

    Este método tornou minha vida de desenvolvimento muito melhor em casos semelhantes.

    Se você precisa fazer alguma limpeza, não importa como a atividade está fechada, você pode usair uma combinação de onSaveInstanceState() e onDestroy() . Um desses deve ser chamado, não importa o quê. Talvez tenha uma boolean cleanupDone em sua atividade, que é definida sempre que uma das duas termina.

    No que diz respeito à salvaguairda de dados do user , veja como save o estado persistente :

    Google sugere uma

    model de user "editair no lugair"

    Ou seja: salve assim que o user crie novos dados, o mais tairdair em onPause() . Isso não significa que você precisa recriair os dados no onResume() , apenas que ele deviewia ter sido salvo.

    A propósito: onStop() pode ser ignorado apenas em dispositivos pré-Honeycomb , ou seja, a pairtir de junho de 2015 , less de 6% de todos os dispositivos. Ainda assim, onSaveInstanceState() deve ser chamado se o onDestroy() ou onStop() forem omitidos.

    Até onde eu fui com Android,

    1 Quando suas aplicações crashrem, cada recurso relevante paira ele é destruído.

    2 Quando o dispositivo mudair a configuration, resultando na atividade a ser destruída e recriada.

    3 Quando aplicativos executados em segundo plano e o Android matá-lo devido à execução em Low Memory

    Além disso, o outro método de callback é chamado, ou seja,

    1 quando outra atividade vem na frente, ou o seu dispositivo bloqueia ..etc

    Em todos os casos, de acordo com sua exigência, você pode liberair todos os seus resources no onDestroy e cancelair o Thread e Asyntask e pairair todos os services, etc. se quiser que sua tairefa permaneça em pausa e viva enquanto estiview destruída, você pode save a configuration e mantê-la enquanto onCreate é chamado novamente por cheque é nulo ou não.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.