Cordova/Phonegap Plugin als Android Service

Das Problem

App-Entwicklung mit Cordova funktioniert großartig. Beim Aufzeichnen von GPS Tracks stößt man aber an die Grenzen der Technologie, da es keine Möglichkeit gibt, einen Prozess zu starten, der nicht automatisch vom System beendet werden kann. Dazu benötigt man ein Plugin…

Ein Android Service

Mit ein wenig Java Kenntnissen ist es einfach einen Hintergrund-Dienst (Service) als Plugin für Cordova zu realisieren. Android kann den Service zwar auch beenden, startet ihn aber sofort wieder, wodurch das GPS tracking fortgesetzt wird. Einen Haken gibt es bei der Sache allerdings: Die Kommunikation zwischen Plugin und der Web-app ist schwierig. Die vorhandene Schnittstelle über den Callback-Context funkioniert (nach meinem Wissen) nicht, da der Service abgekoppelt läuft.

GPS Websocket Server

Moderne Browser unterstützen das effiziente Websocket Protokoll nativ. Der GPS-Service startet einen einfachen Websocket-Server auf einem hohen Port und die Web-app verbindet und wartet auf Messages:

var ws = new WebSocket('ws://localhost:8887/snowhow');
ws.onmessage = function (evt) {
  var data;
  try {
    data = JSON.parse(evt.data);
  } catch (e) {
    console.log("illegal json data via websocket", evt.data);
  }
  handleWSResopnse(data);
}

Doch damit nicht genug: Über den Websocket Server kann das HTML-UI auch die Nachricht zum beenden des Service schicken. Natürlich steigt durch den Server und den Websocket Client der Stromverbrauch etwas, erste Tests haben aber keine dramatischen Änderungen gezeigt.

See also