No documento do Android, aqui http://developer.android.com/reference/android/app/Activity.html , dizia 'Atividade entra em primeiro plano' será chamada onPause()
e 'Atividade não está mais visível' será chamada onStop()
.
'Atividade entra em primeiro plano' não é o mesmo que 'Atividade não está mais visível'? Você pode me dizer qual é a diferença entre eles?
paused
atividade está completamente ativa (mantém todas as informações de estado e membro e permanece anexada ao gerenciador de janelas). Umastopped
atividade também retém todas as informações de estado e membro, mas não está mais anexada aowindow manager
.Respostas:
Não, se alguma atividade entrar em primeiro plano, isso não significa necessariamente que a outra atividade seja completamente invisível. Considere o seguinte caso:
Aqui vemos as duas atividades ao mesmo tempo. A primeira atividade com os campos é obscurecida por outra atividade e o usuário não pode mais interagir com ela. No entanto, ainda é visível com todas as consequências resultantes.
Isso deixa uma dúvida sobre qual atividade é considerada totalmente opaca e cobre toda a tela e qual não é. Esta decisão é baseada na janela que contém a atividade. Se a janela tiver um sinalizador
windowIsFloating
ouwindowIsTranslucent
, considera-se que a atividade não torna invisível o material subjacente; caso contrário, ele faz e fará comonStop()
que seja chamado. O código relevante pode ser encontrado emcom.android.server.am.ActivityRecord
:fonte
onPause()
eonStop()
. É 100%? Se apenas um pixel da atividade anterior estiver visível, ele ainda estáonPause()
?onPause()
não é chamado quando uma caixa de diálogo é exibida.onPause()
só é chamado quando pressiono o botão home . Como isso é possível?Se você ainda conseguir ver parte dela (o
Activity
primeiro plano não ocupa a tela inteira ou é um pouco transparente),onPause()
será chamado. Se você não conseguir ver nenhuma parte,onStop()
será chamado.Uma caixa de diálogo **, por exemplo, pode não cobrir todo o anterior
Activity
, e esse seria um momento paraonPause()
ser chamado.** Não estou me referindo a um Diálogo Android aqui, mas a uma idéia conceitual de algo que aparece e oculta apenas parte da tela do usuário. Esta nota foi adicionada para esclarecer com base em um comentário de @GMsoF abaixo
fonte
Dialog
, como na classe Android. O que eu estava dizendo, porém, é algo que obscurece parcialmente o primeiroActivity
a ilustrar a idéia de que todos os novosActivity
não precisam cobrir completamente o anterior.Estar em primeiro plano significa que a atividade tem foco de entrada. Por exemplo, uma atividade pode ser visível, mas parcialmente obscurecida por uma caixa de diálogo focada. Nesse caso,
onPause()
será chamado, mas nãoonStop()
. Quando a caixa de diálogo desaparecer, oonResume()
método da atividade será chamado (mas nãoonStart()
).fonte
onPause()
é chamado quando o dispositivo entra no modo de suspensão ou quando uma caixa de diálogo é exibida" . Como esse encadeamento deixa claro, porém, um diálogo não significa necessariamente que uma atividade está em pausa (embora seja para, digamos, uma atividade mostrada como um diálogo ).Na prática , deve-se considerar a diferença entre “onPause ()” e “onPause () + onStop ()”.
Sempre que alguma nova atividade ocorre e ocupa algum espaço parcial da tela. Portanto, sua atividade em execução anterior ainda é visível até certo ponto. Nesse caso, a atividade em execução anterior não é enviada para Back Stack. Portanto, aqui apenas o método onPause () é chamado .
Por outro lado, se alguma nova atividade ocorrer e ocupar a tela inteira para que sua atividade em execução anterior desapareça. Nesse caso, sua atividade em execução anteriormente é movida para Back Stack. Aqui, onPause () + onStop () são chamados.
Para Resumos
onPause () - a tela é parcialmente coberta por outra nova atividade. A atividade não é movida para a pilha traseira.
onPause () + onStop () - a tela é totalmente coberta por outra nova atividade. A atividade é movida para a pilha traseira.
Saiba mais sobre- Back Stack .
fonte
Em palavras concisas:
onStop()
do método de ciclo de vida da atividade anterior é chamado quando outra atividade é mostrada. Quando você tem o Diálogo no topo da atividade, eleonPause()
é chamado.Nota : Atividades são os componentes que preenchem sua tela inteira.
Nota : Os diálogos não são Atividade, pois não preenchem completamente a tela.
fonte
Enfrentei muitos problemas com os métodos onPause e onStop e, portanto, limparei três cenários que encontrei:
1. Quando você clica no botão do aplicativo recente, nenhum método de ciclo de vida é chamado, mas o onWindowFocusChanged (boolean hasFocus) é chamado com o valor hasFocus passou como falso. Na versão android antes das 5, o método onPause costumava ser chamado ao pressionar o botão do aplicativo recente.
2. Quando uma atividade pop-up aparece sobre sua atividade, como mencionado por Malcolm , o botão onPause é chamado. Se uma nova atividade que ocupa a tela inteira for chamada, o onStop será chamado na atividade anterior. A caixa de diálogo de permissão do Android também faz com que sua atividade seja chamada de Pausa.
3)Se o tempo limite da tela expirar em sua atividade, a onPause será chamada. Depois de algum tempo, se você não abrir a tela, o onStop será chamado.
Também uma coisa importante mencionada pelo ateiob que completa a resposta
Espero que ajude.
fonte
sempre que uma nova atividade inicia, a atividade anterior
onPause
será chamada de forma desafiadora em qualquer circunstância.na verdade, haverá duas circunstâncias:
1 - uma parte da atividade anterior é visível ou a nova atividade é transparente: somente
onPause
será chamada.2- a atividade anterior é completamente coberta por uma nova atividade: ambas
onPause
eonStop
serão chamadas---- Bom afirmar algumas notas:
NOTA 1: se uma caixa de diálogo iniciar em cima de uma atividade NENHUMA
onPause
ouonStop
será chamada.NOTA 2: se for uma atividade cujo tema está definido como um diálogo, o comportamento será como uma atividade normal.
NOTA 3: aparentemente, uma caixa de diálogo do sistema, como a de permissão, já que o marshmallow causará
onPause
.fonte
Sim, eu tento entender e posso explicar isso abaixo:
Existem 2 atividades: AtividadeA e AtividadeB
Aqui está a atividade B. Siga meu comentário no código
Espero que isso seja claramente
fonte