从远程进程调用Cordova回调

时间:2015-02-05 05:40:16

标签: android cordova callback cordova-plugins

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

1 个答案:

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