Como devo lidar com a persistência de um Android WebView se minha atividade for destruída enquanto mostra outra?

StackOverflow https://stackoverflow.com/questions/2508008

  •  22-09-2019
  •  | 
  •  

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

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top