Estou desenvolvendo aplicativos para Android por um tempo e segui várias postagens sobre o ciclo de vida da atividade e o ciclo de vida do aplicativo.
Conheço Activity.finish()
chamadas de método em algum lugar no caminho Activity.onDestroy()
, e também removo a atividade da pilha, e acho que, de alguma forma, aponta para o sistema operacional e o coletor de lixo que ele pode "fazer seu truque" e liberar a memória quando achar conveniente tão....
Eu vim para este post - Sair de um aplicativo com desdém? e leia a resposta de Mark Murphy.
Isso me deixou um pouco confuso sobre o que exatamente o finish()
método realmente faz.
Existe uma chance de eu ligar finish()
e onDestroy()
não ser chamado?
Respostas:
Ao chamar
finish()
uma atividade, o métodoonDestroy()
é executado. Este método pode fazer coisas como:Além disso,
onDestroy()
não é um destruidor. Na verdade, não destrói o objeto. É apenas um método chamado com base em um determinado estado. Portanto, sua instância ainda está ativa e muito bem * após aonDestroy()
execução e o retorno da superclasse. O Android mantém os processos por perto, caso o usuário queira reiniciar o aplicativo, isso torna a fase de inicialização mais rápida. O processo não fará nada e, se precisar recuperar a memória, o processo será eliminadofonte
Meus 2 centavos na resposta @K_Anas. Eu realizei um teste simples no método finish (). Métodos importantes de retorno de chamada listados no ciclo de vida da atividade
O que quero dizer é que as contrapartes dos métodos, juntamente com os métodos intermediários, são chamadas quando o finish () é executado.
por exemplo:
fonte
Observe também que, se você ligar para terminar () após uma intenção, não poderá voltar à atividade anterior com o botão "voltar"
fonte
onDestroy()
é destinado à limpeza final - liberando recursos que você pode, fechando conexões abertas, leitores, escritores, etc. Se você não o substituir, o sistema fará o que for necessário.por outro lado,
finish()
apenas permite que o sistema saiba que o programador deseja que a correnteActivity
seja concluída. E, portanto, chamaonDestroy()
depois disso.Algo a observar:
não é necessário que apenas uma chamada para a
finish()
desencadeieonDestroy()
. Não. Como sabemos, o sistema Android é livre para matar atividades se achar que existem recursos necessários à correnteActivity
que precisam ser liberados.fonte
finish()
está dizendo ao sistema para finalizar oActivity
. a parte "x" na sua declaração do é "terminar (destruir) oActivity
". A segunda parte está errada. Na verdade, eu perdi uma palavra lá. Eu editei a resposta.onDestroy()
não é apenas acionado porfinish()
, o sistema pode chamá-lo por conta própria também.O método Finish () destruirá a atividade atual. Você pode usar esse método nos casos em que não deseja que essa atividade seja carregada repetidamente quando o usuário pressionar o botão Voltar. Basicamente, limpa a atividade da pilha.current.
fonte
Além da resposta @rommex acima, também notei que
finish()
enfileira a destruição da Atividade e depende da prioridade da Atividade.Se eu ligar
finish()
depoisonPause()
, eu vejoonStop()
eonDestroy()
liguei imediatamente.Se eu ligar
finish()
depoisonStop()
, não vejoonDestroy()
até 5 minutos depois.Pela minha observação, parece que o acabamento está na fila e, quando olhei para
adb shell dumpsys activity activities
ele, estava definido comofinishing=true
, mas como não está mais em primeiro plano, não foi priorizado para destruição.Em resumo,
onDestroy()
nunca é garantido que seja chamado, mas, mesmo no caso em que é chamado, pode ser adiado.fonte
Várias respostas e notas estão reivindicando que finish () pode pular onPause () e onStop () e executar diretamente onDestroy (). Para ser justo, a documentação do Android ( http://developer.android.com/reference/android/app/Activity.html ) observa "A atividade está sendo finalizada ou destruída pelo sistema", o que é bastante ambíguo, mas pode sugerir que finish () pode pular para onDestroy ().
O JavaDoc em finish () é igualmente decepcionante ( http://developer.android.com/reference/android/app/Activity.html#finish () ) e, na verdade, não observa quais métodos são chamados em resposta ao final ()
Então, escrevi este mini-aplicativo abaixo do qual registra cada estado na entrada. Ele inclui um botão que chama terminar () - para que você possa ver os logs de quais métodos foram acionados. Este experimento teria sugerido que acabamento () , de fato, também chamada onPause () e onStop (). Aqui está a saída que recebo:
fonte
@ user3282164 De acordo com o ciclo de vida da Atividade , ele deve passar por
onPause()
->onStop()
->onDestroy()
ao ligarfinish()
.O diagrama não mostra nenhum caminho reto de [Activity Running] para [
onDestroy()
] causado pelo sistema.O documento onStop () diz " Observe que esse método nunca pode ser chamado, em situações de pouca memória em que o sistema não possui memória suficiente para manter o processo da sua atividade em execução após a chamada do método onPause (). "
fonte
Meu estudo mostra que o
finish()
método realmente coloca algumas operações de destruição na fila, mas a Atividade não é destruída imediatamente. A destruição está agendada.Por exemplo, se você colocar
finish()
noonActivityResult()
callback, enquantoonResume()
ainda tem de executar, então primeiroonResume()
será executado, e só depois dissoonStop()
eonDestroy()
são chamados.NOTA:
onDestroy()
pode não ser necessário, como indicado na documentação .fonte
chamar terminar em onCreate () não chamará onDestroy () diretamente como disse @prakash. o
finish()
operação nem começará até você retornar o controle para o Android.A conclusão de chamada () em onCreate () : onCreate () -> onStart () -> onResume () . Se o usuário sair do aplicativo, chamará -> onPause () -> onStop () -> onDestroy ()
Concluindo a chamada () em onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()
Concluindo a chamada () em onResume () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()
Para referência adicional, verifique este oncreate contínuo após o término e sobre o término ()
fonte
Parece que a única resposta correta aqui até agora foi dada pelo romnex: "onDestroy () pode nem ser chamado". Embora na prática, em quase todos os casos, não haja garantia: a documentação em finish () promete apenas que o resultado da atividade seja propagado de volta ao chamador, mas nada mais. Além disso, a documentação do ciclo de vida esclarece que a atividade é passível de matança pelo sistema operacional assim que o onStop () termina (ou mesmo mais cedo em dispositivos mais antigos), o que, apesar de improvável e, portanto, raro de observar em um teste simples, pode significar que a atividade pode ser morto enquanto ou antes de onDestroy () ser executado.
Portanto, se você quiser garantir que algum trabalho seja feito quando você chamar finish (), não poderá colocá-lo em onDestroy (), mas precisará fazê-lo no mesmo local em que você chama finish (), antes de realmente chamá-lo.
fonte
finish () apenas envia de volta à atividade anterior no android, ou pode ser que você possa dizer que está dando um passo atrás no aplicativo
fonte