Android Phonegap 3.4:在 AsyncTask 完成时通知 javascript



我有同样的问题,就像Android上的Peacemoon一样 Phonegap:当AsyncTask完成时通知javascript

好吧,这适用于较旧的PhoneGap版本,但是...我的问题:这不适用于较新的PhoneGap版本,如PhoneGap 3.4。

插件类现在继承自 CordovaPlugin,执行方法的返回类型现在是布尔值,参数是 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版本上如何工作?

以下是我的 phonegap 3.x 插件类的样子:

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

My MainActivity 实现了 CordovaInterface,因为新版本的 Cordova/PhoneGap。因此,有必要实现方法"startActivityForResult"。如果我调用"this.cordova.startActivityForResult((CordovaPlugin) this, intent, 0)",则范围设置在MainActivity上,并且新意图的调用将遍历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 方法中,如果发生错误,我必须使用"返回真"或"返回假"。在onActivityResult方法中,我必须使用'myCallbackContext.success(obj);'。没有别的。我不需要像'this.myCallbackContext.sendPluginResult(pluginResult);'这样的东西。

最新更新