2015-02-05 3 views
1

Можно ли вызвать обратный вызов javascript с помощью кордовы из удаленного процесса?Invoke Cordova callback от удаленного процесса

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

Я полагаю, что я нашел свой собственный ответ. Нет, вы не можете вызвать обратный вызов 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, если ваш обратный вызов влияет на пользовательский интерфейс.

Смежные вопросы