某些插件,需要你开启另一个activity,然后返回cordova的activity,并得到结果。
下面是两种情形:
一、 直接在插件类中使用 跳转activity
- 第一步:
public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode);
说明:这个方法是继承CordovaPlugin基类后的cordova成员变量的方法。用法和普通的activity一样,只不过第一个参数必须为 CordovaPlugin 或者其子类。
- 第二步:
在 插件类中重写下面的方法, 在这个方法中可以得到结果。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
二、插件类中使用了另一个other类,传入了context参数后,other跳转activity
此时,如果想要activity返回结果还是在插件类中得到。则步骤是:
- Other otherObject = new Other(cordova.getActivity()); //传入context,other类调用了跳转activity的方法
- 插件类调用 cordova.setActivityResultCallback(CordovaPlugin plugin);//设置返回结果时调用此插件中的onActivityResult方法
- 在插件类中重写方法:onActivityResult(int requestCode, int resultCode, Intent intent)
cordova 结果回调重复调用
另外,比如做一个搜索蓝牙的插件,由于结果不是一次性给出的,可能隔一会就搜到一个蓝牙设备,需要把结果传给js层,此时如果直接反复去调用mCallbackContext.success(“device:”+name);或者mCallbackContext.error(“失败”);会报错。
查看cordova 发送结果回调的实现:
public void sendPluginResult(PluginResult pluginResult) {
synchronized (this) {
if (finished) {
Log.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage());
return;
} else {
finished = !pluginResult.getKeepCallback();
}
}
webView.sendPluginResult(pluginResult, callbackId);
}
所以用下面的方法可以反复通知js层,使得js层获得信息。
PluginResult pluginResult = new PluginResult(PluginResult.Status.OK,"中间消息");
pluginResult.setKeepCallback(true);
callbackContext.sendPluginResult(pluginResult);