2012-02-23 16 views
8

Ho creato un plugin per il servizio in background (per eseguire l'applicazione in background) in PhoneGap.Come creare plugin in PhoneGap per eseguire l'applicazione in background?

Ecco il mio codice java per 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();"); 
    } 

} 

e il mio file 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()); 
}); 

e nel mio index.html. Ho aggiunto il codice seguente nel mio clic del pulsante

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

Il mio errore è:

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 

caso ho rimosso StartService (nuovo Intent (questo, MyService.class)); da file java ho ottenuto l'errore di seguito:

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 

altrimenti non posso in grado di eseguire l'applicazione sto ottenendo l'errore nel file.Am java ricevendo il segno di croce rossa (come 'X') nell'angolo sinistro di questa riga 'startService (new Intent (this, MyService.class));' per favore dimmi dove mi sbaglio, per favore guidami, grazie in anticipo.

please check the image where i am getting the error sto ottenendo l'errore in service.when START I spostare il cursore sulla StartService sto ottenendo creare il metodo 'StartService (intenzione)'

e sto avendo il dubbio in questo plugin Posso grado per eseguire javascript in background o no.Se è possibile ottenere l'avviso in background.Per favore dimmi dove ho torto, per favore guidami, grazie in anticipo.

+0

Sua Misericordia, siamo in grado di farlo funzionare? A caso puoi pubblicare un progetto di esempio per gli altri? – Henry

risposta

9

La creazione del plug-in va bene. Si crea il proprio servizio come un normale file java. E poi Appena chiami questo plugin. hai appena iniziato il tuo servizio come

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

Quindi il servizio verrà eseguito in background. Questo è un modo semplice per fare.

caso a parte si crea un servizio poi

vostro Plugin dovrebbe assomigliare a questa

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

vostri js del file dovrebbe essere simile

function BackgroundService() { 
}; 

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

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

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

Ed tua HTML Il file dovrebbe apparire così

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

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

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

Inoltre è necessario registrare il plug-in per phonegap in res/xml/plugins.xml come

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

grazie per la tua risposta, provo questo, ma la mia applicazione è forzata chiusa.e ottenere l'errore di seguito citato in logcatplease dimmi la soluzione, gentilmente guida me.grazie in anticipo. – Mercy

+0

grazie per la tua risposta, ci provo ma la mia applicazione è forzata chiusa e ricevendo l'errore nel logcat per favore dimmi la soluzione, gentilmente guidami.grazie in anticipo. – Mercy

+0

Condividi il tuo log degli errori .... –

0

Nel metodo onCreate della classe Java che si estende da DroidGap assicurarsi di aver impostato "keepRunning" correttamente.

 super.setBooleanProperty("keepRunning", true); 
Problemi correlati