Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating an Android Service with Phonegap? (Have phonegap app run even when closed)

I have been working on an Android app using Phonegap and now would like to make it so when the app is closed it can still execute the java/js code in the app. So I understand I need to create a service. If I create a service plugin on phonegap can I still execute the javascript code or only the java?

Has anyone does something like this? I found this discussion but did not seem to work: http://groups.google.com/group/phonegap/browse_thread/thread/722b0e796baa7fc6 So that is all I have right now.

Before I turn to developing it native if I can't figure it out thought I would ask if anyone has done this before. I can't seem to find any of the phonegap plugins that do something similar.

EDIT: I have got an app that executes Java code as a service. However when it calls sendjavascript it does not work. So is there a way to have the javascript code running in the background as well when an app is closed with phonegap?

Thanks

like image 909
Jonovono Avatar asked Apr 27 '12 01:04

Jonovono


People also ask

What are the tools required to develop the PhoneGap application for Android?

Eclipse ADT Plugin ADT (Android Development tools) is a plugin of eclipse which provide a complete IDE for developing Android application. ADT lets you create new Android projects, and it lets you create Android projects from existing source (this is the way we will open our PhoneGap app for android on eclipse).

What are the files required to create your own PhoneGap?

PhoneGap plugin contains two files. JavaScript file that defines the function for accessing the native hooks. Implementation files written in the native language to co-ordinate with native phone features.


4 Answers

No, it is not possible to run Javascript code in the background (at least in my opinion) as a service. Phonegap on Android uses an special activity called Droidgap, which hosts a WebView. This browser control executes the JavaScript. This means that JS execution can only handled inside this activity, regardless if it is visible or not.

The code you linked from Google Groups tries to bind a service developed in Java to the DroidGap activity, so the service is NOT written in JS.

You can have some background activity within your JS code inside your child activity derived from the DroidGap activity. For example have a background thread in your activity, have a JS callback function and let the thread call this callback functionality.

If you really need a service you have to go native.

Update:
JS code can only be executed with the Droidgap activity. An activity can have 3 states (based on the Lifecycle of activites):

  1. visible
  2. invisible but still loaded
  3. not loaded

I provided a sample in which I implemented a Phonegap plugin. The plugin allows the activity to register itself to SMS_RECEIVED. When the activies goes out of scope (event onbeforeunload), it deregisters, so only issue 1 is handled.

When you want all 3 issues handled, you have to forward the incoming SMS intent to the activity. When it is not loaded the system will automatically load and activate the activity. But this is not a background service anymore, your app would become visible whenever a SMS is received.

If you don't want this (if you really want a background service), you have to provide a native implementation.

like image 65
ChrLipp Avatar answered Oct 09 '22 00:10

ChrLipp


There is this article on how to create a service on Android with Phonegap which gives some good information on your problem.

It's using a great plugin in order to build a background service with phonegap easily. But you can't use JS though

I didn't find a way to make JS to run in the Background. BUT you can pass parameters from Java to JS and vice versa with the plugin...which is pretty useful. You would still need to rewrite your JS code in Java though. Unless you do have a specific reason to only want JS to be run? (But there shouldn't be...)

Hope that could be useful to some people visiting this page.

like image 40
Bruno Avatar answered Oct 09 '22 01:10

Bruno


YES, and it is very simple... just install the plugin backgroundJS:

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

It allows you to run javascript on the background and combined with the local notification plugin, you can even send notifications to the user at any time, just keep in mind that doing this will cause the battery to run out faster, also consider that this might create a problem with the iOS policy. good luck!!!

like image 4
Michel Tobon Avatar answered Oct 09 '22 00:10

Michel Tobon


You can try to add plugin cordova-plugin-background-mode

But as author says:
Infinite background tasks are not official supported on most mobile operation systems and thus not compliant with public store vendors. A successful submssion isn't garanteed. Use the plugin by your own risk!

like image 2
Maxim Avatar answered Oct 09 '22 01:10

Maxim