Meu aplicativo Android atual precisa ligar
ActivityManager.clearApplicationUserData()
para simular o usuário limpando o armazenamento de aplicativos
O que funciona bem.
Um efeito colateral da chamada clearApplicationUserData()
é que o aplicativo está (compreensivelmente) fechado.
O que oferece uma experiência ruim ao usuário.
Estou tendo dificuldade em reiniciar meu aplicativo depois de ligar clearApplicationUserData()
.
Eu tentei usar startActivity
, Alarm Manager
com Pending Intent
, Foreground
/ Background
service.
Nada funciona.
É impossível reiniciar um aplicativo Android que ligou clearApplicationUserData()
?
android
android-intent
Hector
fonte
fonte
clearApplicationUserData()
?" - Duvido que isso seja possível no seu próprio aplicativo. Mostre uma mensagem ao usuário explicando que isso acontecerá antes de chamar esse método, e o usuário poderá reiniciar o aplicativo a partir do iniciador.clearApplicationUserData
, esse será o fluxo desejado. Você pode verificar o código-fonte ..MainActivity
. Se isso for possível, é altamente recomendável! Caso contrário, talvez algo como agendar uma tarefa comWorkManager
(que não seja (?) Afetada por dados claros do aplicativo) para iniciar sua atividade?Respostas:
( 1ª resposta : esta resposta só funciona em situações limitadas. Não é uma resposta completa)
public boolean clearApplicationUserData ()
Descrição
Retorno :
true
se o aplicativo solicitou com êxito que os dados do aplicativo fossem apagados;false
de outra forma.Conforme o site de referência indicado, temos um repatriado antes do fechamento do pedido. então, usaremos esse repatriado para reiniciar o aplicativo.
quando Activity
onDestroy()
eonStop()
são chamados de aplicativo de reinicialização.Colocamos a ação de reinicialização em ambos
onDestroy()
eonStop()
para garantir que o aplicativo seja reiniciado novamente.E também, acho que é uma boa ideia forçar a interrupção da atividade antes que o SO a interrompa.
é porque, garante
onDestroy()
eonStop()
será invocado.fonte
ActivityManager.clearApplicationUserData()
o processo do aplicativo é morto a força. Nenhuma outra linha de código é executada.Minha sugestão pode parecer trivial, mas você já considerou não ligar
ActivityManager.clearApplicationUserData()
?Aqui o que os documentos dizem sobre esse método:
Portanto, para imitar esse comportamento, basta limpar os diretórios de armazenamento interno e externo. Não são necessárias permissões para acessar nenhuma delas.
fonte
( 2ª resposta : preciso de muito mais contribuição)
Após 8 horas pesquisando no sistema operacional Android e no site para desenvolvedores do Android , a fim de encontrar uma solução para reiniciar a atividade quando
clearApplicationUserData
for chamada. Finalmente, eu seria capaz de encontrar uma boa solução para hackers .Esta solução parece zidane drible :)
Vamos apresentar a solução. a princípio,
clearApplicationUserData
limpa todas as pistas do aplicativo quando é invocado, como tarefas, notificações, alarmes e etc., portanto, é impossível chamar explicitamente a atividade .maneira implícita é a única maneira possível de chamar atividade.
Após alguns testes, descobri que o aplicativo
manifest
registradointent-filters
não seria removido e eles podem ouvir as transmissões do sistema .Aproximadamente, 98% das transmissões do sistema não seriam recebidas pelo aplicativo liberado e que 2% restantes poderiam não ser transmitidos muito em breve.
então o que fazer ? hmmm? vamos lá cara, eu preciso encontrar uma solução ...
bingo, preciso acionar algo para que o sistema o transmita <= parece hackear :)
então eu decido escolher WIFI_STATE_CHANGED porque
manifest.xml
MainActivity.java
demonstração
lembre-se, é apenas um produto mínimo viável que precisa ser mais desenvolvido para torná-lo perfeito.
fonte
Feliz codificação.
fonte
Limpar os dados do aplicativo no dispositivo por meio da API
clearApplicationUserData()
redefine o aplicativo como se tivesse acabado de ser instalado. Como você descobriu, todos os alarmes e transmissões registrados no seu aplicativo também são limpos. A maneira mais eficiente de manter seu aplicativo em primeiro plano seria limpar os dados por conta própria, como outros indicaram, em vez de usar a API. Aqui está um exemplo: https://stackoverflow.com/a/9073473/949224No entanto , se você estiver determinado a usar a API (que garante que todos os dados sejam limpos) e o aplicativo for interrompido à força, tenho uma sugestão:
Crie um aplicativo complementar pequeno que possa ser iniciado imediatamente antes de você limpar os dados do aplicativo. O aplicativo complementar simplesmente o reinicia, possivelmente após um curto período de tempo.
O aplicativo complementar em si precisa ser fechado posteriormente e, idealmente, deve ser oculto da pilha de atividades etc.
Eu já vi esse trabalho com o Android 6.0, mas não há garantias de que ele seria versátil e funcionaria de maneira geral. Seria preciso fazer mais para tornar o aplicativo complementar sem interface do usuário, se desejado, e ficar oculto no iniciador do telefone. Você provavelmente também desejaria agrupar o APK como um arquivo em seu próprio aplicativo e instalá-lo na primeira execução, o que exigiria que o usuário habilitasse a instalação a partir de "Fontes desconhecidas" (loja não Play). Isso pode ser feito através da intenção de obter as configurações corretas do sistema, se necessário, mas os usuários precisariam de uma boa explicação sobre por que isso é necessário.
Então, como eu estava dizendo, a abordagem mais simples é limpar os dados e as permissões do aplicativo.
fonte