Comment dois-je faire face à la persistance d'un Android WebView si mon activité est détruite tout en montrant un autre?
Question
Je construis une application Android qui est basé autour d'un WebView amélioré (basé sur PhoneGap). J'ai amélioré le WebView de sorte que de l'exécution de JavaScript à l'intérieur, vous pouvez appeler le sélecteur de contact natif de choisir un numéro de téléphone (qui peut être fournie par Facebook par exemple).
Le problème est que je le sélecteur de contact natif fonctionne dans une activité dans un autre processus et les docs Android disent que si une autre activité est ouvert mon activité peut être détruit en raison des contraintes de mémoire. Je ne l'ai pas vraiment vu cela se produire dans ma demande, mais si elle a fait alors je devine l'état de ma WebView serait détruite et le code qui attendait le contact choisi prendrait fin.
Il semble un peu fou que l'activité demandant un contact pourrait être détruit tandis que le sélecteur de contact est ouvert. Est-ce que quelqu'un sait si cela ne se produit en effet? Est-il un moyen de conserver l'état de la WebView si elle fait?
Merci,
-Shaun
La solution
Quelqu'un sait si cela ne fait arriver?
Vous regardez le problème trop simplement.
Vous avez un WebView
. Vous ouvrez l'application Contacts. Bien que l'utilisateur se trouve dans l'application Contacts, un appel téléphonique entre en jeu. Alors que sur l'appel téléphonique (en utilisant un casque Bluetooth), un message textuel arrive, afin que l'utilisateur ouvre que jusqu'à la date de notification. Tout en restant sur l'appel téléphonique et envoyer des SMS loin, un texte vient avec un lien, elle tape et fait apparaître l'application du navigateur.
En ce moment, votre activité est sûrement détruite, sauf peut-être quelques-uns des plus récents téléphones qui ont un peu juste de RAM.
Maintenant, est-ce courant? Non. Cependant, cela n'a rien à voir avec l'application Contacts - si l'utilisateur appuie sur HOME, à un moment donné à l'avenir, votre activité peut être détruite pour libérer de la RAM et
.Y at-il un moyen de maintenir l'état de WebView si elle fait?
Cela dépend de ce que vous considérez comme « l'état du WebView
» soit. C'est vraiment le travail de PhoneGap, si vous faites une application basée sur PhoneGap. Ainsi, vous pouvez envisager de les demander.
Il n'y a aucun moyen pour conserver les DOM. Il y a plusieurs façons triviales Persister l'URL (voir onSaveInstanceState()
). Et il peut y avoir des choses entre ce que vous considérez comme une partie de « l'état de la WebView
» qui peuvent ou peuvent ne pas être possible d'enregistrer.
Autres conseils
La réponse longue et détaillée est un peu compliqué, mais essentiellement, il se résume à quelques points:
- Si le système d'exploitation Android doit aller nettoyer Activités ou services, il sait comment établir des priorités ceux qui doivent aller d'abord. Elle le fait selon qu'ils sont actuellement au premier plan (dernier aller), au milieu de l'exécution du code, dans l'attente d'un résultat, ou tout simplement assis inactif dans l'arrière-plan (premier à aller). Vous pouvez être raisonnablement certain que si l'activité de votre WebView a lancé le sélecteur de contact à l'aide du startActivityForResult, il ne sera pas tué
- Il y a tout un système pour la sauvegarde des données si une activité est tuée, comme la méthode OnPause (qui sont déclenchées dès que votre activité quitte l'avant-plan), la méthode
onSaveInstanceState
qui est appelée lorsque votre activité est sur le point de mourir. Renseignez-vous sur ceux pour obtenir plus d'informations, et la méthode configurationChanged lorsque l'orientation de l'écran change. Si vous ne l'avez pas lu au moins écumer le document du Activité du cycle de vie sur la page des développeurs, vous devez le faire. - Enfin, je suis sûr que cette question a été abordée à plusieurs reprises, mais avec plus ou moins légèrement libellé ou situations. Regardez autour de vous, voir ce que vous pouvez trouver.