2014-03-04 64 views
3

我有這樣Peacemoon同樣的問題上Android Phonegap: Notify javascript when an AsyncTask is finished的Android的PhoneGap 3.4:通知時的AsyncTask完成

好JavaScript的,這適用於年齡較大的PhoneGap版本,但... 我的問題:這不起作用上較新的PhoneGap版本,如PhoneGap 3.4。

現在插件類繼承自CordovaPlugin,現在執行方法的返回類型是boolean,而參數是CallbackContext,而不是int callbackId等等。我現在如何才能實現異步任務?

我的方法:

private CallbackContext myCallbackContext; 

@Override 
public boolean execute(String action, JSONArray args, 
    final CallbackContext callbackId) 
{ 
    this.myCallbackContext = callbackId; 
    if (action.equals("test")) 
    { 
     Intent intent = new Intent("com.companyname.name.TEST"); 
     this.cordova.startActivityForResult((CordovaPlugin) this, intent, 0); 

     // create an empty result, because the asynchronous call can take long 
     PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT); 
     pluginResult.setKeepCallback(true); 
     this.myCallbackContext.sendPluginResult(pluginResult); 

     this.myCallbackContext.success; 

     return true; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    if (requestCode == 0) 
    { 
     if (resultCode == Activity.RESULT_OK) 
     { 
      Bundle korb = intent.getExtras(); 
      String osVersion = korb.getString("osVersion"); 


      JSONObject obj = new JSONObject(); 
      try 
      { 
       obj.put("osVersion", osVersion); 
      } catch(JSONException e) 
      { 
       // Log 
      } 
PluginResult result = new PluginResult(PluginResult.Status.OK, obj); 
      result.setKeepCallback(false); 
      this.myCallbackContext.sendPluginResult(result); 

      this.myCallbackContext.success(obj); 
} 

我回JavaScript是不確定的。但它適用於舊版本的PhoneGap版本,比如1。它如何在更新的PhoneGap版本上運行?

回答

0

我的MainActivity實現CordovaInterface。所以有必要實施「startActivityForResult」方法。如果我調用了「this.cordova.startActivityForResult((CordovaPlugin)this,intent,0)」,則範圍在MainActivity上設置,而新意圖的Call將通過MainActivity中的方法「startActivityForResult」。所以,結果會返回到MainActivity中的「onActivityResult」。在這裏,我要叫我的方法在插件:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent){ 
    Log.d("Debug", "-----> MainActivity: onActivityResult"); 
    if(this.activityResultCallback != null) 
    { 
     // this is the solution :) 
     this.activityResultCallback.onActivityResult(requestCode, resultCode, intent); 
    } 
} 

此外,對於意圖呼叫工作:

Intent intent = new Intent(this.cordova.getActivity(), com.companyname.name.TestActivity.class); 
if (this.cordova != null) { 
    this.cordova.startActivityForResult(this, intent, 0); 
    return true; 
} 

Intent intent = new Intent("com.companyname.name.TEST"); 
if (this.cordova != null) { 
    this.cordova.startActivityForResult((CordovaPlugin) this, intent, 0); 
} 

<!--you must add the String to the AndroidManifest.xml--> 
<activity 
    android:name=".TestActivity" 
    android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="de.companyname.name.TEST" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity>  

否則(QuickFix的是如何描述)的exute方法如果發生錯誤,我必須使用'return true'或'return false'。在onActivityResult方法中,我必須使用'myCallbackContext.success(obj);'。沒有其他的。我不需要像'this.myCallbackContext.sendPluginResult(pluginResult)'''。

1

這裏就是我的PhoneGap的3.x的插件類的樣子:因爲科爾多瓦/ PhoneGap的較新版本

public CallbackContext callbackContext; 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
     this.callbackContext = callbackContext; 

     if (action.equals("anAction")) { 
      Intent intent = new Intent(this.getActivity(),com.companyname.name.TEST.class); 
      if (this.cordova != null) { 
       this.cordova.startActivityForResult(this, intent, 0); 
       return true; 
      } 
     } 
     return false; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    switch (requestCode) { 
    case 0: 
     //retour de la version utilisant le sample de imense alpr 
     if(resultCode == android.app.Activity.RESULT_OK){ //0:ok  
      String result=intent.getStringExtra("result"); 
      this.callbackContext.success(result); 
     } 
     else{ 
      String message=intent.getStringExtra("result"); 
      this.callbackContext.error(message); 
     } 

     break; 
    default: 
     break; 
    } 
} 
+0

這不適合我。 我的com.companyname.name.TEST活動昨天沒有被調用。有些方法是空的或在我的MainActivity中返回null,但以下例外: @Override public Activity getActivity(){ return this; } 今天,我將代碼添加到這些方法中,如cordova的framewokk/src中的CordovaActivity.java文件中的代碼。所以,我的com.companyname.name.TEST活動被調用。但是onActivityResult不會被調用。 我上面的代碼位於從CordovaPlugin擴展的TestPlugin類中。 我的MainActivity從Activity延伸並實現了CordovaInterface。 – Jean

+0

您不需要對cordova應用程序的主要活動進行任何更改以使插件能夠正常工作,只需對擴展CordovaPlugin類的類進行操作即可,這裏是您意圖啓動的活動。當你想退出com.companyname.name.TEST時,你打電話給setResult(resultcode,intent)和finish()嗎? – QuickFix

+0

檢查我的答案在這個其他職位,也許它會有所幫助:http://stackoverflow.com/questions/21858861/phonegap-android-plugin-close-the-plugin-activity – QuickFix