是否可以使用来自远程进程的cordova调用javascript回调?
plugin.xml中:
<service android:name="MyLocationListeningService" android:process=":remote" />
MyLocationService.java:
public MyLocationListeningService extends Service implements LocationListener {
public void onLocationChanged(Location location) {
//invoke a javascript callback with cordova
}
}
答案 0 :(得分:1)
我相信我找到了自己的答案。不,你不能从远程进程调用Cordova的javascript回调。要调用回调,您需要保留CallbackContext。 CallbackContext仅通过CordovaPlugin.execute提供,仅在&#34; main&#34;上调用。申请流程(即webview运行的流程)。
但是,您可以在本机安卓代码中的进程之间进行通信。因此,您可以根据远程进程的提示在原始进程上调用回调。
Android中的进程之间有很多通信方式。一种是为在原始过程中运行的接收器广播动作。
AndroidMaifest.xml
<service android:name="MyLocationListeningService" android:process=":remote" />
<receiver android:enabled="true" android:exported="true" android:label="MyReceiver" android:name="my.package.MyReceiver">
<intent-filter>
<action android:name="Success" />
</intent-filter>
</receiver>
插件
public class MyPlugin extends CordovaPlugin {
public static CallbackContext myCallbackContext;
public boolean execute(String action, JSONArray data, final CallbackContext callbackContext) {
if ("SaveCallbackContext".equalsIgnoreCase(action)) {
myCallbackContext = callbackContext;
//Note: we must return true so Cordova doesn't invoke the error
//callback from the provided callbackContext.
return true;
}
}
}
Receiver(在与插件相同的过程中执行)
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("Success".equals(intent.getAction()) {
MyPlugin.callbackContext.success();
}
}
}
服务(在插件的不同过程中执行)
public MyLocationListeningService extends Service implements LocationListener {
public void onLocationChanged(Location location) {
Intent i = new Intent(this.getApplicationContext(), MyReceiver.class);
i.setAction("Success");
this.getApplicationContext().sendBroadcast(i);
}
}
注意:此答案并不代表原始流程终止时的情况。
此外,如果您想多次调用回调,可能会对Keep callback context in PhoneGap plugin?感兴趣。
如果你的回调影响了用户界面,那么你会对http://docs.phonegap.com/en/4.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins感兴趣。