从远程进程调用 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 感兴趣。
是否可以从远程进程使用 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 感兴趣。