Erstellen eines Android-Dienstes mit Phonegap? (Lassen Sie die Phonegap-App auch im geschlossenen Zustand laufen.)

74

Ich habe mit Phonegap an einer Android-App gearbeitet und möchte sie jetzt so gestalten, dass sie beim Schließen der App weiterhin den Java / JS-Code in der App ausführen kann. Ich verstehe also, dass ich einen Service erstellen muss. Wenn ich ein Service-Plugin auf Phonegap erstelle, kann ich trotzdem den Javascript-Code oder nur Java ausführen?

Hat jemand so etwas gemacht? Ich fand diese Diskussion, schien aber nicht zu funktionieren: http://groups.google.com/group/phonegap/browse_thread/thread/722b0e796baa7fc6 Das ist also alles, was ich jetzt habe.

Bevor ich mich der Entwicklung von Native zuwende, wenn ich es nicht herausfinden kann, dachte ich, ich würde fragen, ob dies schon jemand getan hat. Ich kann anscheinend keine der Phonegap-Plugins finden, die etwas Ähnliches tun.

BEARBEITEN: Ich habe eine App, die Java-Code als Dienst ausführt. Wenn es jedoch sendjavascript aufruft, funktioniert es nicht. Gibt es also eine Möglichkeit, den Javascript-Code auch im Hintergrund auszuführen, wenn eine App mit Phonegap geschlossen wird?

Vielen Dank

Jonovono
quelle
Welche Art von Code möchten Sie im Hintergrund ausführen?
Coder_sLaY
Ich möchte in der Lage sein, das Javascript noch im Hintergrund laufen zu lassen. Damit auch bei geschlossener App das Javascript noch ausgeführt wird.
Jonovono

Antworten:

56

Nein, es ist nicht möglich, Javascript-Code im Hintergrund (zumindest meiner Meinung nach) als Dienst auszuführen. Phonegap unter Android verwendet eine spezielle Aktivität namens Droidgap , die ein WebView hostet. Dieses Browser-Steuerelement führt das JavaScript aus. Dies bedeutet, dass die JS-Ausführung nur innerhalb dieser Aktivität ausgeführt werden kann, unabhängig davon, ob sie sichtbar ist oder nicht.

Der von Google Groups verknüpfte Code versucht, einen in Java entwickelten Dienst an die DroidGap-Aktivität zu binden, sodass der Dienst NICHT in JS geschrieben ist.

Sie können einige Hintergrundaktivitäten in Ihrem JS-Code in Ihrer untergeordneten Aktivität haben, die von der DroidGap-Aktivität abgeleitet sind. Haben Sie beispielsweise einen Hintergrund-Thread in Ihrer Aktivität, haben Sie eine JS-Rückruffunktion und lassen Sie den Thread diese Rückruffunktion aufrufen.

Wenn Sie wirklich einen Dienst benötigen, müssen Sie einheimisch werden.

Update:
JS-Code kann nur mit der Droidgap-Aktivität ausgeführt werden. Eine Aktivität kann 3 Zustände haben (basierend auf dem Lebenszyklus von Aktivitäten ):

  1. sichtbar
  2. unsichtbar aber immer noch geladen
  3. nicht geladen

Ich habe ein Beispiel bereitgestellt, in dem ich ein Phonegap-Plugin implementiert habe. Das Plugin ermöglicht es der Aktivität, sich bei SMS_RECEIVED zu registrieren. Wenn die Aktivitäten den Gültigkeitsbereich verlassen (Ereignis beim Vorladen), wird die Registrierung aufgehoben, sodass nur Problem 1 behandelt wird.

Wenn alle drei Probleme behandelt werden sollen, müssen Sie die eingehende SMS-Absicht an die Aktivität weiterleiten. Wenn es nicht geladen ist, lädt und aktiviert das System die Aktivität automatisch. Dies ist jedoch kein Hintergrunddienst mehr. Ihre App wird sichtbar, wenn eine SMS empfangen wird.

Wenn Sie dies nicht möchten (wenn Sie wirklich einen Hintergrunddienst wünschen), müssen Sie eine native Implementierung bereitstellen.

ChrLipp
quelle
3
Vielen Dank. Wenn ich das verstehe, könnte ich einen Dienst erstellen, der einen Javascript-Rückruf aufruft? Zum Beispiel könnte ich einen Dienst in Java-Code haben, der beim Empfang einer Textnachricht eine Javascript-Rückruffunktion aufruft, um JS-Code auszuführen? Das wäre perfekt. Ich habe dieses Plugin gefunden, das einen Service zu erstellen scheint und Js Code
aufruft
Super, das sieht gut aus. Vielen Dank! Wenn ich also die Zurück-Taste drücke, während die App ausgeführt wird, sollte sie trotzdem in die Konsole schreiben, wenn ein eingehender Text eingeht? Es scheint nicht?
Jonovono
1
Nein, weil ich mich abmelde, wenn die Aktivität geschlossen ist. Für Ihre Anforderung müssen wir die Aktivität pro Absicht aktivieren und benötigen kein Plugin. In den nächsten zwei Tagen kann ich jedoch keine Probe zur Verfügung stellen.
ChrLipp
hmm ok danke Also sollte es nicht so schwer sein? Es scheint großartig zu funktionieren. Ich brauche es nur, um auch js Code auszuführen.
Jonovono
1
Ihr Github-Link in "Update 2" scheint veraltet zu sein.
Mike N
9

In diesem Artikel erfahren Sie, wie Sie mit Phonegap einen Dienst für Android erstellen, der einige gute Informationen zu Ihrem Problem enthält.

Es verwendet ein großartiges Plugin, um auf einfache Weise einen Hintergrunddienst mit Phonegap zu erstellen. Sie können JS jedoch nicht verwenden

Ich habe keine Möglichkeit gefunden, JS dazu zu bringen, im Hintergrund zu laufen. ABER Sie können mit dem Plugin Parameter von Java an JS und umgekehrt übergeben ... was sehr nützlich ist. Sie müssten Ihren JS-Code jedoch immer noch in Java neu schreiben. Es sei denn, Sie haben einen bestimmten Grund, nur JS ausführen zu lassen? (Aber es sollte nicht geben ...)

Hoffe, dass dies für einige Besucher dieser Seite nützlich sein könnte.

Bruno
quelle
Bitte veröffentlichen Sie die URL
SMKS
Bitte reposte die URL
Ali Hayder
1
Vielleicht veraltet, aber ich wollte den Artikel lesen. Es ist auf archive.org: web.archive.org/web/20130820140521/http://…
Jason
4

JA, und es ist sehr einfach ... installieren Sie einfach das Plugin backgroundJS:

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

Sie können Javascript im Hintergrund ausführen und in Kombination mit dem lokalen Benachrichtigungs-Plugin jederzeit Benachrichtigungen an den Benutzer senden. Beachten Sie jedoch, dass der Akku dadurch schneller leer wird. Beachten Sie auch, dass dies möglicherweise der Fall ist Erstellen Sie ein Problem mit der iOS-Richtlinie. Viel Glück!!!

Michel Tobon
quelle
1
Leider heißt es "Plattform (en): iOS", so dass es für Android nicht funktioniert :(
s.krueger
1
Das obige Plugin läuft in meinem Fall nicht unendlich, nach ca. 3 Minuten werden die Hintergrundfunktionen gestoppt. Ich habe versucht, die SetBackgroundSecondsMethode auf ungefähr 300 Sekunden einzustellen , aber es hat auch nicht funktioniert. Die Konsole stoppt die Protokollierung nach ungefähr 180 Sekunden.
Juan Carlos Alpizar Chinchilla
@ Juan Carlos ... für mich funktioniert es ungefähr 6 Stunden, dann ist es durcheinander, es ist wichtig, dass Sie Aktivitäten in Ihrer Anwendung haben ... Ich denke, das macht den Trick
Michel Tobon
@MichelTobon was meinst du mit aktivitäten? Ich habe ein js-Intervall, in dem X Minuten ausgeführt werden, abhängig von der Wahl des Benutzers in den Einstellungen. Die Zeit, die es dauert, ist jedoch zwischen 3 und 10 Minuten nach weiteren Tests zufällig. Vielleicht mache ich etwas falsch. Können Sie eine jsfiddle, einen Kern oder einen ähnlichen Link über die Implementierung teilen?
Juan Carlos Alpizar Chinchilla
1
@ JuanCarlosAlpizarChinchilla das ist die Geige, es ist wirklich einfach jsfiddle.net/EJE4R/6
Michel Tobon
2

Sie können versuchen, das Plugin Cordova-Plugin-Hintergrund-Modus hinzuzufügen

Aber wie der Autor sagt:
Unendliche Hintergrundaufgaben werden auf den meisten mobilen Betriebssystemen nicht offiziell unterstützt und sind daher nicht mit Anbietern öffentlicher Geschäfte kompatibel. Eine erfolgreiche Einreichung ist nicht garantiert. Verwenden Sie das Plugin auf eigenes Risiko!

Maxime
quelle