How to create plugin in phonegap to run the application in background?
Asked Answered
R

2

8

I have created plugin for background service (to run the application in background) in phonegap.

here is my java code for plugin:

public class BackgroundService extends Plugin {
    @Override
    public PluginResult execute(String action, JSONArray args, String callbackId)
    {
        PluginResult.Status status = PluginResult.Status.OK;
        String result = "";

        try {
            if (action.equals("onCreate")) {
                this.onCreate();
            }
            else if (action.equals("onBind")) {
                Intent intent = null;
                this.onBind(intent);
            }
            else if (action.equals("onDestroy")) {
                this.onDestroy();
            }
            else if (action.equals("onStart")) {
                Intent intent = null;
                this.onStart(intent,args.getInt(1));
            }
            else if (action.equals("onUnbind")) {
                Intent intent = null;
                this.onUnbind(intent);
            }
            return new PluginResult(status, result);
        } catch(JSONException e) {
            return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
        }
    }
    public void onCreate() {

        // TODO Auto-generated method stub



        }
    public IBinder onBind(Intent intent) {

        // TODO Auto-generated method stub



        return null;

        }
    public void onDestroy() {

        // TODO Auto-generated method stub

        super.onDestroy();



        }
    public void onStart(Intent intent, int startId) {

        // TODO Auto-generated method stub

        //super.onStart(intent, startId);



        }
    public boolean onUnbind(Intent intent) {

        // TODO Auto-generated method stub



        }
    public void onPause()
    {
        super.webView.loadUrl("javascript:navigator.BackgroundService.onBackground();");
    }

    public void onResume()
    {
        super.webView.loadUrl("javascript:navigator.BackgroundService.onForeground();");
    }

}

and my js file is:

function BackgroundService() {
};

BackgroundService.prototype.create = function() {
    PhoneGap.exec(null, null, "BackgroundService", "onCreate", []);
};

BackgroundService.prototype.destroy = function() {
    PhoneGap.exec(null, null, "BackgroundService", "onDestroy", []);
};

BackgroundService.prototype.start = function(intent,startId) {
    PhoneGap.exec(null, null, "BackgroundService", "onStart", [intent,startId]);
};

BackgroundService.prototype.bind = function(intent) {
    PhoneGap.exec(null, null, "BackgroundService", "onBind", [intent]);
};

BackgroundService.prototype.unbind = function(intent) {
    PhoneGap.exec(null, null, "BackgroundService", "onUnbind", [intent]);
};
PhoneGap.addConstructor(function() {
    PhoneGap.addPlugin("BackgroundService", new BackgroundService());
});

and in my index.html. I have added the below code in my button click

navigator.BackgroundService.onCreate(); navigator.BackgroundService.onStart(intent,1);

My error is:

ERROR/AndroidRuntime(14981): FATAL EXCEPTION: main

ERROR/AndroidRuntime(14981): java.lang.RuntimeException: Unable to instantiate service com.app.newly.BackgroundService: java.lang.ClassCastException: com.app.newly.BackgroundService

ERROR/AndroidRuntime(14981):at android.app.ActivityThread.handleCreateService(ActivityThread.java:2943)

ERROR/AndroidRuntime(14981):at android.app.ActivityThread.access$3300(ActivityThread.java:125)

ERROR/AndroidRuntime(14981):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2087)
ERROR/AndroidRuntime(14981):     at android.os.Handler.dispatchMessage(Handler.java:99)

ERROR/AndroidRuntime(14981):     at android.os.Looper.loop(Looper.java:123)

ERROR/AndroidRuntime(14981):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(14981):     at java.lang.reflect.Method.invokeNative(Native Method)

ERROR/AndroidRuntime(14981):     at java.lang.reflect.Method.invoke(Method.java:521)

ERROR/AndroidRuntime(14981):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

ERROR/AndroidRuntime(14981):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(14981):     at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(14981): Caused by: java.lang.ClassCastException: com.app.newly.BackgroundService
ERROR/AndroidRuntime(14981):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2940)
ERROR/AndroidRuntime(14981):     ... 10 more

If I removed startService(new Intent(this,MyService.class)); from java file I got the below error:

ERROR/Web Console(4785): ReferenceError: Can't find variable: SqlitePlugin at file:///android_asset/www/BackgroundService.js:31
ERROR/Web Console(4785): TypeError: Result of expression 'window.plugins.SqlitePlugin' [undefined] is not an object. at file:///android_asset/www/index.html:26

otherwise I can't able to run the application I am getting the error in the java file.Am getting the red cross mark(like 'X') in the left corner of this line 'startService(new Intent(this,MyService.class));' please tell me where I am wrong,please guide me,thanks in advance.

please check the image where i am getting the error I am getting the error in start service.when i move the cursor to the startService i am getting create method 'startService(intent)'

And I Am having the doubt in this plugin can i able to run the javascript in background or not.If it is possible how to get the alert in background.please tell me where I am wrong,please guide me,thanks in advance.

Rebarbative answered 23/2, 2012 at 11:51 Comment(1)
Her Mercy, we're you able to get this to work? At chance you can post a sample project for others?Hulky
P
8

Creation of plugin is fine.You create your service just like a normal java file. And then As soon as you call this plugin . you just start your service like

startService(new Intent(this, MyService.class));

Then your service will run in background.This is an easy way to do.

If separately you create service then

Your Plugin should look like this

public class BackgroundService extends Plugin {

private static final String TAG = "BackgroundService";
private static final String CALL_SERVICE_ACTION = "callService";

@Override
public PluginResult execute(String action, JSONArray args, String callbackId)
{
    Log.i(TAG, "Plugin Called");
PluginResult result = null;

if (CALL_SERVICE_ACTION.equals(action)) {
    Log.d(TAG, "CALL_SERVICE_ACTION");
    startService(new Intent(ctx, MyService.class));
}

else {
    result = new PluginResult(Status.INVALID_ACTION);
    Log.d(TAG, "Invalid action : " + action + " passed");
}

return result;
}
}

Your .js file should look like this

function BackgroundService() {
};

BackgroundService.prototype.callService = function(successCallback, failCallback) {

return PhoneGap.exec(successCallback, failCallback, "BackgroundService",
    "callService", [ null ]);
};

PhoneGap.addConstructor(function() {
PhoneGap.addPlugin("BackgroundService", new BackgroundService());
});

And your HTML file should look like this

function callServiceFunction() {
window.plugins.BackgroundService.callService('callService',
        callServiceSuccessCallBack, callServiceFailCallBack);

}
function callServiceSuccessCallBack(e) {
alert("Success");
}

function callServiceFailCallBack(f) {
alert("Failure");
}

Also you need to register your phonegap plugin in your res/xml/plugins.xml like

<plugin name="BackgroundService" value="package-structure.BackgroundService"/>
Poison answered 24/2, 2012 at 11:1 Comment(12)
thanks for your reply ,I try this but my application is force closed.and getting the below mentioned error in logcatplease tell me the solution ,kindly guide me.thanks in advance.Rebarbative
thanks for your reply ,I try this but my application is force closed.and getting the error in logcat please tell me the solution ,kindly guide me.thanks in advance.Rebarbative
I have edited my post with my error in log cat .please verify and tell me the solution thanks in advance.Rebarbative
See the problem might be that you are trying to run BackgroundService.java as service which is extending the phonegap plugin.So In order to run a background service you need to extend a service and as well as register it in your manifest file. SO that is the reason i told you to create a seperate service.java and just invoke it through your pluginPoison
I have created seperate service.java.But I don't know how to invoke it through my plugin.please guide me.thanks in advanceRebarbative
Thanks for your reply,In java file I am getting the error in this line startService(new Intent(this, MyService.class));The error is create method 'startService(intent)'.I can't able to run the application.please guide me.thanks in advance.Rebarbative
I have edited my post with my error please verifyand tell me the solution thanks in advance.Rebarbative
Instead of startService(new Intent(this, MyService.class)); use startService(new Intent(ctx, MyService.class)); And are you sure you have registered your service in the Manifest file?Poison
I have added in android manifest file like this:<service android:name=".BackgroundService"/>I have updated my post with the error and doubt.Please verify and tell me the solution.Thanks in Advance.Rebarbative
hey u shuld atleast figure this yourself. You have to use context. ctx.startService(new Intent(this,MyService.class));Poison
thanks for your reply.service is started.But I want to run javascript in background.Is it possible to get the alert in background and need to call the wcf rest service .kindly please help me.thanks in advanceRebarbative
This Question is "How to create plugin in phonegap to run the application in background?" Your service got started.For separate question start a new thread. Already this question has become complex.Kindly Accept the answer and start new thread for a new thing.this will be helpful for others...Poison
A
0

In the onCreate method of your Java class that extends from DroidGap make sure you have set "keepRunning" properly.

        super.setBooleanProperty("keepRunning", true);
Anam answered 26/11, 2013 at 5:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.