Я полагаю, что я нашел свой собственный ответ. Нет, вы не можете вызвать обратный вызов javascript с помощью Кордовы из удаленного процесса. Чтобы вызвать обратный вызов, вам необходимо сохранить CallbackContext. CallbackContext предоставляется только через 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();
}
}
}
Services (выполняется в другом процессе из плагина)
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, если ваш обратный вызов влияет на пользовательский интерфейс.