Como devo lidar com a persistência de um Android WebView se minha atividade for destruída enquanto mostra outra?
Pergunta
Estou construindo um aplicativo Android baseado em um WebView aprimorado (com base no PhoneGap). Aprimorei o WebView para que, do JavaScript em execução, você possa invocar o seletor de contato nativo para escolher um número de telefone (que possa ser fornecido pelo Facebook, por exemplo).
O problema que tenho é que o seletor de contato nativo é executado em uma atividade em outro processo e os documentos do Android dizem que, enquanto outra atividade está aberta, minha atividade pode ser destruída devido a restrições de memória. Na verdade, eu não vi isso acontecer no meu aplicativo, mas se aconteceu, acho que o estado do meu webview seria destruído e o código que estava esperando o contato escolhido seria encerrado.
Parece um pouco louco que a atividade solicitando um contato possa ser destruída enquanto o seletor de contato está aberto. Alguém sabe se isso realmente acontece? Existe uma maneira de persistir o estado da WebView, se o fizer?
Obrigado,
-Shaun
Solução
Alguém sabe se isso realmente acontece?
Você está olhando para o problema também simplesmente.
Você tem um WebView
. Você abre o aplicativo de contatos. Enquanto o usuário está no aplicativo de contatos, uma ligação entra. Enquanto está na chamada telefônica (usando um fone de ouvido Bluetooth), uma mensagem de texto entra, para que o usuário abre isso a partir de sua notificação. Enquanto ainda está de telefone e mensagens de texto, um texto entra com um link, então ela o toca e traz o aplicativo do navegador.
A essa altura, sua atividade é certamente destruída, exceto talvez em alguns dos telefones mais recentes que têm um pouco de carneiro.
Agora, isso é comum? Não. No entanto, isso também não tem nada a ver com o aplicativo de contatos - se o usuário pressionar para casa, em algum momento no futuro, sua atividade poderá ser destruída para liberar Ram também.
Existe uma maneira de persistir o estado da WebView, se o fizer?
Isso depende do que você considera "o estado do WebView
"Para ser. Este é realmente o trabalho do PhoneGap, se você estiver fazendo um aplicativo baseado em telefone. Portanto, considere perguntar a eles.
Não há como persistir o DOM. Existem maneiras triviais de persistir o URL (ver onSaveInstanceState()
). E pode haver coisas entre isso que você considera parte do "estado do WebView
"Isso pode ou não ser possível salvar.
Outras dicas
A resposta longa e detalhada é um pouco complicada, mas essencialmente se resume a alguns pontos:
- Se o sistema operacional Android precisar limpar atividades ou serviços, ele sabe como priorizar quais devem ser primeiro. Isso é feito com base em se estão atualmente em primeiro plano (o último a ir), no meio da execução do código, aguardando um resultado ou simplesmente sentado inativo em segundo plano (primeiro a ir). Você pode estar razoavelmente certo de que, se sua atividade da WebView lançar o seletor de contato usando o startActivityForresult, ela não será morta
- Existe um sistema inteiro para salvar dados se uma atividade for morta, como o método onPause (que são acionados assim que sua atividade sair do primeiro plano), o
onSaveInstanceState
Método chamado quando sua atividade está prestes a morrer. Leia sobre isso para obter mais informações e o método ConfigurationChanged quando a orientação da tela mudar. Se você não tem pelo menos Skim leia o Ciclo de vida da atividade Documento na página Desenvolvedores, você deve fazer isso. - Por fim, tenho certeza de que essa pergunta foi abordada muitas vezes, mas com uma redação ou situações ligeiramente variadas. Dê uma olhada em volta, veja o que mais você pode encontrar.