2010-03-24 9 views
0

Je construis une application Android basée sur un WebView amélioré (basé sur PhoneGap). J'ai amélioré le WebView afin que JavaScript puisse fonctionner à l'intérieur et que vous puissiez appeler le sélecteur de contacts natif pour choisir un numéro de téléphone (qui peut être fourni par Facebook par exemple).Comment devrais-je faire face à la persistance d'un WebView Android si mon activité est détruite alors que j'en montre une autre?

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 ouverte mon activité peut se détruit en raison des contraintes de mémoire. Je n'ai pas vraiment vu cela se produire dans mon application, mais si c'était le cas, je devinais que l'état de mon WebView serait détruit et que le code qui attendait le contact sélectionné serait terminé.

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 arrive vraiment? Existe-t-il un moyen de persister l'état du WebView si c'est le cas?

Merci,

-Shaun

Répondre

0

Est-ce que quelqu'un sait si cela ne en effet se produire?

Vous regardez le problème trop simplement. Vous avez un WebView. Vous ouvrez l'application de contacts. Pendant que l'utilisateur est dans l'application de contacts, un appel téléphonique arrive. Pendant l'appel téléphonique (à l'aide d'un casque Bluetooth), un message texte arrive, de sorte que l'utilisateur l'ouvre à partir de sa notification. Alors qu'il est toujours en ligne et envoie des SMS, un texte arrive avec un lien, alors elle tape dessus et affiche 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 commun? Non. Cependant, cela n'a rien à voir avec l'application de contacts - si l'utilisateur appuie sur HOME, à un moment donné dans le futur, votre activité pourrait être détruite pour libérer de la RAM.

Y a-t-il un moyen de conserver l'état de le WebView si c'est le cas?

Cela dépend de ce que vous considérez comme étant "l'état du WebView". C'est vraiment le travail de PhoneGap, si vous faites une application basée sur PhoneGap. Donc, vous pourriez envisager de leur demander.

Il est impossible de conserver le DOM. Il existe des façons triviales de conserver l'URL (voir onSaveInstanceState()). Et il peut y avoir des choses entre les deux que vous considérez comme faisant partie de "l'état du WebView" qui peut ou ne peut pas être sauvegardé.

0

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 passer le nettoyage up Activités ou Services, il sait prioriser ceux qui devraient aller en premier. Cela se fait selon qu'ils sont actuellement au premier plan (le dernier à partir), en train d'exécuter du code, d'attendre un résultat ou simplement de rester inactif en arrière-plan (premier à partir). 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és dès que votre activité quitte le premier plan), la méthode onSaveInstanceState est appelée lorsque votre activité est sur le point de mourir. Lisez ces informations pour obtenir plus d'informations et la méthode configurationChanged lorsque l'orientation de l'écran change. Si vous n'avez pas lu au moins le document Activity Lifecycle sur la page des développeurs, vous devez le faire.
  • Enfin, je suis sûr que cette question a été abordée plusieurs fois, mais avec des formulations ou des situations légèrement différentes. Regardez autour de vous, voyez ce que vous pouvez trouver d'autre.