从远程进程调用 Cordova 回调

Invoke Cordova callback from remote process

是否可以从远程进程使用 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
    }
}

我相信我找到了自己的答案。不,您不能从远程进程使用 Cordova 调用 javascript 回调。要调用回调,您需要保留仅在 "main" 应用程序进程(即 webview 运行的进程)上调用的 CallbackContext. The CallbackContext is only provided via CordovaPlugin.execute

但是,您可以使用本机 android 代码在进程之间进行通信。因此,您可以根据远程进程的提示在原始进程上调用回调。

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

接收器(与插件在同一进程中执行)

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? 感兴趣。

如果您的回调影响 UI,您会对 http://docs.phonegap.com/en/4.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins 感兴趣。