我有同样的问题,就像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);'这样的东西。