如何在phonegap中创build插件在后台运行应用程序?

我在phonegap中创build了后台服务的插件(在后台运行应用程序)。

这里是我的插件的Java代码:

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();"); } } 

和我的js文件是:

 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()); }); 

并在我的index.html。 我已经添加了下面的代码在我的button点击

navigator.BackgroundService.onCreate(); navigator.BackgroundService.onStart(意向,1);

我的错误是:

 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 

如果我删除了startService(new Intent(this,MyService.class)); 从Java文件我得到了以下错误:

 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 

否则我无法运行应用程序我得到的错误在java文件中。获取红色十字标记(如' X ')在这一行的左上angular'startService(new Intent(this,MyService.class ));” 请告诉我哪里错了,请指导我,谢谢提前。

请检查我得到错误的图像 我得到错误启动service.when我将光标移动到startService我得到创build方法'startService(intent)'

我有这个插件的疑问,我可以在后台运行JavaScript或不。如果有可能如何得到在background.sease警报告诉我,我错了,请指导我,在此先感谢。

Solutions Collecting From Web of "如何在phonegap中创build插件在后台运行应用程序?"

创build插件是好的。你创build你的服务就像一个普通的Java文件。 然后,只要你叫这个插件。 你只是像开始你的服务

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

然后你的服务将在后台运行。这是一个简单的方法。

如果分开你创build服务

你的插件应该看起来像这样

 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; } } 

你的.js文件应该像这样

 function BackgroundService() { }; BackgroundService.prototype.callService = function(successCallback, failCallback) { return PhoneGap.exec(successCallback, failCallback, "BackgroundService", "callService", [ null ]); }; PhoneGap.addConstructor(function() { PhoneGap.addPlugin("BackgroundService", new BackgroundService()); }); 

而你的HTML文件应该是这样的

 function callServiceFunction() { window.plugins.BackgroundService.callService('callService', callServiceSuccessCallBack, callServiceFailCallBack); } function callServiceSuccessCallBack(e) { alert("Success"); } function callServiceFailCallBack(f) { alert("Failure"); } 

你也需要在你的res / xml / plugins.xml中注册你的phonegap插件

 <plugin name="BackgroundService" value="package-structure.BackgroundService"/> 

在从DroidGap扩展的Java类的onCreate方法中,确保已经正确设置了“keepRunning”。

  super.setBooleanProperty("keepRunning", true);