Se meu aplicativo estiver em execução e eu pressionar o botão home, o aplicativo entrará em segundo plano. Agora, se um toque longo do botão home e matar o aplicativo passando-o na lista de aplicações recentes, nenhum dos eventos gosta onPause()
, onStop()
ou onDestroy()
é chamado sim o processo é encerrado. Portanto, se eu quiser que meus serviços parem, eliminem notificações e cancelem o registro de ouvintes, como posso fazer isso? Eu li alguns artigos e blogs, mas não obtive nenhuma informação útil e não encontrei nenhuma documentação sobre isso. Qualquer ajuda seria apreciada. Desde já, obrigado.
104
Respostas:
Acabei de resolver um problema semelhante.
Aqui está o que você pode fazer se for apenas interromper o serviço quando o aplicativo for encerrado, deslizando da lista de aplicativos recentes.
Dentro de seu arquivo de manifesto, mantenha a bandeira
stopWithTask
comotrue
para serviço. Gostar:Mas como você diz que deseja cancelar o registro de ouvintes e interromper a notificação, etc., sugiro esta abordagem:
Dentro de seu arquivo de manifesto, mantenha a bandeira
stopWithTask
comofalse
para serviço. Gostar:Agora a seu
MyService
serviço, substitua o métodoonTaskRemoved
. (Isso será disparado apenas sestopWithTask
estiver definido comofalse
).Consulte minha pergunta para obter mais detalhes, que também contém outra parte do código.
Espero que isto ajude.
fonte
Encontrei uma maneira de fazer isso
faça um serviço como este
}
2) registrar este serviço em manifest.xml
3) Em seguida, inicie este serviço em sua atividade inicial
E agora, sempre que você limpar seu aplicativo do Android recente, este método onTaskRemoved () será executado.
fonte
Resolvi problema semelhante. Se desejar que, após deslizar da tarefa recente e na próxima inicialização, ela se comporte corretamente, siga as etapas abaixo: -
1) Salve o ID do processo na preferência compartilhada:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Quando o aplicativo é iniciado a partir do iniciador após limpar a partir da tarefa recente, faça:
fonte
Quando você pressiona home -
onPause
eonStop
sua atividade está sendo chamada, então, neste momento, você deve fazer todas as economias e limpar, porque a plataforma Android não garante mais queonDestroy
ou qualquer outro método de ciclo de vida seria invocado, então o processo poderia ser encerrado sem qualquer notificação.fonte
onPause()
eonstop()
eles precisam ser encerrados apenas quando o usuário sair do aplicativo, ou seja, efetuar logout.Você precisa salvar seus dados quando on
onPause()
é chamado. Veja este diagrama de ciclo de vida: Desenvolvedor AndroidVocê pode ver que um aplicativo pode ser encerrado após
onPause()
ouonStop()
.Manuseie seus dados lá e recupere-os em
onRestart()
\onCreate()
.boa sorte!
fonte
Você não pode lidar com o deslize, porque o sistema apenas remove seu processo da memória sem chamar nenhum retorno de chamada.
Eu verifiquei que antes de o usuário chamar a tela de "aplicativos recentes", onPause () será sempre chamado. Portanto, você precisa salvar todos os dados no método onPause sem marcar isFinishing ().
Para verificar o botão Voltar, use o método onBackPressed.
fonte
ViewModel.onCleared () pode ser útil, se o objetivo for liberar algum recurso (talvez um sistema em execução em algum outro lugar da rede) quando o usuário executa uma saída surpresa deslizando o dedo, em vez de pressionar o botão ou "parar". [Foi assim que cheguei originalmente a esta questão].
O aplicativo não recebe uma notificação e Activity.onDestroy () é chamado para mudanças de configuração, como mudanças na orientação, então a resposta não está lá. Mas ViewModel.onCleared é chamado quando o aplicativo é retirado (bem como quando o usuário sai da atividade). Se o recurso que você deseja usar está associado a mais de uma atividade na pilha, você pode adicionar contagens de referência ou algum outro mecanismo para decidir se ViewModel.onClear deve liberar o recurso.
Este é mais um dos muitos bons motivos para usar ViewModel.
- Bob
fonte
Eu realmente não sei por que as abordagens acima não estão funcionando no meu caso, mesmo eu definindo
android:stopWithTask="false"
queonTaskRemoved()
não chamado.Outra boa abordagem seria usar
AndroidViewModel
. Este até funciona no caso em que o usuário sai do aplicativo pressionando o botão Voltar.Apenas vincule a
ViewModel
classe ao seuMainActivity
e faça oonCleared()
callback da tarefa .Exemplo:
em seguida, vincule-o à sua MainActivity:
~ Voila!
fonte
Isso funcionou para mim no Android 6,7,8,9.
Faça um serviço como este:
2) Registre este serviço em
manifest.xml
:3) Em seguida, inicie este serviço em sua atividade inicial
fonte
Como Bob Cram mencionou em sua resposta, o método onCleared () do View Model é a resposta. Funciona em ambos os casos:
O onTaskRemoved () do serviço funcionará quando o usuário deslizar o dedo sobre o aplicativo em segundo plano, mas não funcionará quando os aplicativos forem limpos usando o botão matar todos.
Mas o método onCleared () do viewModel funciona em ambos os casos. Você pode usar if para interromper qualquer processo em andamento ou limpar qualquer tarefa no servidor remoto.
fonte