2012-02-23 13 views
8

He creado el complemento para el servicio en segundo plano (para ejecutar la aplicación en segundo plano) en phonegap.¿Cómo crear un complemento en phonegap para ejecutar la aplicación en segundo plano?

aquí es mi código java para el 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();"); 
    } 

} 

y mi js es:

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

y en mi index.html. He agregado el código siguiente en mi botón haga clic en

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

Mi error es:

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 

Si me quita StartService (nueva Intención (esto, MyService.class)); de archivo Java que tiene el siguiente 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 

de lo contrario no puedo capaz de ejecutar la aplicación que estoy recibiendo el error en el file.Am java conseguir la marca de cruz roja (como 'X') en la esquina izquierda de esta línea 'startService (new Intent (this, MyService.class));' por favor dime dónde estoy equivocado, por favor guíame, gracias de antemano.

please check the image where i am getting the error estoy recibiendo el error en service.when inicio i mover el cursor a la StartService estoy consiguiendo crear método 'StartService (intención)'

y estoy teniendo la duda en este plugin Puedo poder para ejecutar el javascript en segundo plano o no.Si es posible cómo obtener la alerta en segundo plano. Por favor, dime dónde me equivoco, por favor guíame, gracias de antemano.

+0

Her Mercy, ¿usted puede hacer que esto funcione? ¿En la posibilidad puedes publicar un proyecto de muestra para otros? – Henry

Respuesta

9

La creación del complemento está bien. Usted crea su servicio como un archivo java normal. Y luego tan pronto como llame a este complemento. usted acaba de comenzar su servicio como

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

Luego su servicio se ejecutará en segundo plano. Esta es una manera fácil de hacerlo.

Si se crea por separado servicio, entonces

Su Plugin debería tener este aspecto

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

Sus Js archivo debe tener este aspecto

function BackgroundService() { 
}; 

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

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

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

Y su HTML El archivo debería verse así

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

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

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

También debe registrar su plugin de teléfono en su res/xml/plugins.xml como

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

gracias por su respuesta, intento esto, pero mi aplicación se cierra forzadamente. Y obteniendo el error mencionado a continuación en logcatplease, dígame la solución, guárdeme amablemente. Gracias de antemano. – Mercy

+0

gracias por su respuesta, intento esto pero mi aplicación es forzar cerrado.y obtener el error en logcat por favor dígame la solución, amablemente guíame.gracias de antemano. – Mercy

+0

Comparta su registro de errores .... –

0

En el método onCreate de la clase Java que se extiende desde DroidGap asegúrese de que ha establecido "keepRunning" correctamente.

 super.setBooleanProperty("keepRunning", true); 
Cuestiones relacionadas