web-dev-qa-db-fra.com

Création d'un Android Service avec Phonegap? (L'application Phonegap est-elle exécutée même lorsqu'elle est fermée)

Je travaille sur une application Android à l'aide de Phonegap et souhaite maintenant que, lorsque l'application est fermée, elle puisse toujours exécuter le code Java/js dans l'application. Je comprends donc qu'il me faut créer un service Si je crée un plugin de service sur phonegap, puis-je quand même exécuter le code javascript ou seulement le java?

Quelqu'un a-t-il fait quelque chose comme ça? J'ai trouvé cette discussion mais ne semble pas fonctionner: http://groups.google.com/group/phonegap/browse_thread/thread/722b0e796baa7fc6 C'est tout ce que j'ai pour le moment.

Avant de commencer à le développer en natif, si je ne parviens pas à comprendre, je me demanderais si quelqu'un l'a déjà fait. Je n'arrive pas à trouver les plugins phonegap qui font quelque chose de similaire.

EDIT: J'ai une application qui exécute le code Java en tant que service. Cependant, lorsqu'il appelle sendjavascript, il ne fonctionne pas. Il existe donc un moyen de faire fonctionner le code javascript en arrière-plan quand une application est fermée avec phonegap?

Merci

72
Jonovono

Non, il n'est pas possible d'exécuter du code Javascript en arrière-plan (du moins à mon avis) en tant que service. Phonegap on Android utilise une activité spéciale appelée Droidgap , qui héberge une WebView. Ce contrôle de navigateur exécute le JavaScript. Cela signifie que l'exécution de JS ne peut être gérée qu'à l'intérieur de cette activité, qu'elle soit visible ou non.

Le code que vous avez lié à partir de Google Groupes tente de lier un service développé dans Java à l'activité DroidGap. Le service n'est donc PAS écrit en JS.

Vous pouvez avoir une activité en arrière-plan dans votre code JS dans votre activité enfant dérivée de l'activité DroidGap. Par exemple, vous avez un fil d’arrière-plan dans votre activité, une fonction de rappel JS et laissez le fil appeler cette fonctionnalité de rappel.

Si vous avez vraiment besoin d'un service, vous devez devenir natif.

Mise à jour:
Le code JS ne peut être exécuté qu'avec l'activité Droidgap. Une activité peut avoir 3 états (basé sur le cycle de vie des activités ):

  1. visible
  2. invisible mais toujours chargé
  3. pas chargé

J'ai fourni un exemple dans lequel j'ai implémenté un plugin Phonegap. Le plugin permet à l’activité de s’inscrire à SMS_RECEIVED. Lorsque les activités sortent du cadre (événement onbeforeunload), il se désenregistre, de sorte que seul le problème 1 est traité.

Lorsque vous souhaitez que les 3 problèmes soient traités, vous devez transférer l'intention SMS entrante vers l'activité. Lorsqu'il n'est pas chargé, le système chargera et activera automatiquement l'activité. Mais ce n'est plus un service en arrière-plan, votre application deviendrait visible chaque fois qu'un SMS est reçu.

Si vous ne le souhaitez pas (si vous voulez vraiment un service en arrière-plan), vous devez fournir une implémentation native.

56
ChrLipp

Il y a cet article sur la façon de créer un service sur Android avec Phonegap, qui donne de bonnes informations sur votre problème.

Il utilise un excellent plugin afin de créer facilement un service d’arrière-plan avec phonegap. Mais vous ne pouvez pas utiliser JS si

Je n'ai pas trouvé le moyen de faire en sorte que JS fonctionne en arrière-plan. MAIS vous pouvez passer des paramètres de Java à JS et inversement avec le plugin ... ce qui est très utile. Cependant, vous devrez toujours réécrire votre code JS dans Java. À moins que vous n'ayez une raison spécifique de vouloir uniquement exécuter JS? (Mais il ne devrait pas y avoir ...)

J'espère que cela pourrait être utile à certaines personnes visitant cette page.

8
Bruno

OUI, et c'est très simple ... il suffit d'installer le plugin backgroundJS:

https://build.phonegap.com/plugins/4

Il vous permet d’exécuter javascript en arrière-plan et, associé au plug-in de notification local, vous pouvez même envoyer des notifications à l'utilisateur à tout moment. N'oubliez pas que cela entraînera une décharge plus rapide de la batterie. Pensez également que cela créer un problème avec la stratégie iOS. bonne chance!!!

4
Michel Tobon

Vous pouvez essayer d’ajouter un plugin cordova-plugin-background-mode

Mais comme le dit l'auteur:
Les tâches en arrière-plan infinies ne sont pas officiellement prises en charge sur la plupart des systèmes d'exploitation mobiles et ne sont donc pas compatibles avec les fournisseurs de magasins publics. Une soumission réussie n'est pas garantie. Utilisez le plugin à vos risques et périls !

2
Maxim