如何在phonegap中创建插件在后台运行应用程序? [英] How to create plugin in phonegap to run the application in background?
问题描述
我已经在phonegap中创建了用于后台服务的插件(在后台运行应用程序)。
这里是我的插件的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自动生成方法存根
}
public IBinder onBind(Intent intent){
// TODO自动生成的方法存根
return null;
}
public void onDestroy(){
// TODO自动生成方法存根
super.onDestroy();
}
public void onStart(Intent intent,int startId){
// TODO自动生成方法存根
//super.onStart(inint,startId);
}
public boolean onUnbind(Intent intent){
// TODO自动生成方法存根
}
public void onPause()
{
super.webView.loadUrl(javascript:navigator.BackgroundService.onBackground(););
}
public void onResume()
{
super.webView.loadUrl(javascript:navigator.BackgroundService.onForeground(););
}
}
/ p>
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。我在我的按钮中添加了以下代码
navigator.BackgroundService.onCreate();
navigator.BackgroundService.onStart(intent,1);
我的错误是:
ERROR / AndroidRuntime(14981):FATAL EXCEPTION:main
错误/ AndroidRuntime(14981):java.lang.RuntimeException:无法实例化服务com.app.newly。 BackgroundService:java.lang.ClassCastException:com.app.newly.BackgroundService
错误/ AndroidRuntime(14981):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2943)
ERROR / AndroidRuntime(14981):在android.app.ActivityThread.access $ 3300(ActivityThread.java:125)
错误/ AndroidRuntime(14981):在android.app.ActivityThread $ H。 handleMessage(ActivityThread.java:2087)
错误/ AndroidRuntime(14981):在android.os.Handler.dispatchMessage(Handler.java:99)
错误/ AndroidRuntime(14981):at android.os.Looper.loop(Looper.java:123)
错误/ AndroidRuntime(14981):在android.app.ActivityThread.main(ActivityThread.java:4627)
错误/ AndroidRuntime(14981):在java.lang.reflect.Method.invokeNative(本地方法)
错误/ AndroidRuntime(14981):在java.lang.reflect.Method.invoke(Method.java:521 )
错误/ AndroidRuntime(14981):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
错误/ AndroidRuntime ):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
错误/ AndroidRuntime(14981):在dalvik.system.NativeStart.main(本地方法)
错误/ AndroidRuntime(14981):导致:java.lang.ClassCastException:com.app.newly.BackgroundService
错误/ AndroidRuntime(14981):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2940)
ERROR / AndroidRuntime(14981):... 10 more
如果我移除 startService new Intent(this,MyService.class)); 从java文件我得到了以下错误:
ERROR / Web控制台(4785):ReferenceError:找不到变量:SqlitePlugin at file:///android_asset/www/BackgroundService.js:31
错误/ Web控制台(4785):TypeError:表达式窗口的结果。 plugins.SqlitePlugin'[undefined]不是一个对象。在file:///android_asset/www/index.html:26
否则我无法运行应用程序我在java文件中得到错误。在此行的startService(new Intent(this,MyService)的左上角获得红色的十字标记(如' X
我得到的错误在开始service.when我移动光标到startService我得到创建方法'startService (intent)'
我有这个插件的疑问,我可以在后台运行javascript或者。如果可能如何获取警报
创建插件是很好的。创建你的服务就像一个普通的java文件。
然后一旦你调用这个插件。你只是开始你的服务像
startService(new Intent(this,MyService.class));
然后你的服务将在后台运行。这是一个简单的方法。
如果单独创建服务,
您的插件应类似于
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,无效操作:+ action +passed);
}
返回结果;
}
}
您的 .js 文件应该像这样
function BackgroundService(){
};
BackgroundService.prototype.callService = function(successCallback,failCallback){
return PhoneGap.exec(successCallback,failCallback,BackgroundService,
callService [ 空值 ]);
};
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中注册你的phonegap插件。 xml like
< plugin name =BackgroundServicevalue =package-structure.BackgroundService/&
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.
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.
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"/>
这篇关于如何在phonegap中创建插件在后台运行应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!