Запуск JavaScript-события от Android
Я создал приложение Cordova. Я запускаю фоновый сервис для выполнения какой-то родной задачи в приложении. Мне нужно вызвать событие java-script, как только фоновая служба выполнит свою задачу. Можно ли вызвать JS события с Android?. Не удалось найти каких-либо убедительных ответов на этот вопрос. Мне нужны события, потому что приложение завелось, чтобы дождаться завершения задачи в фоновом режиме. Я хочу, чтобы событие уведомило приложение, что задача выполнена. Есть ли лучший способ реализовать эту логику?
1 ответ
Сама Cordova не раскрывает свои свойства веб-просмотра публично для использования другими классами Java, но вы можете сделать это с помощью минимального плагина Cordova, который позволит вашей фоновой службе получить доступ к веб-представлению Cordova для выполнения в нем javascript из уровня Java. Тогда это просто вопрос введения JS для запуска события.
Сначала вы должны создать плагин Cordova, чтобы предоставить необходимые элементы Cordova вашему фоновому сервису:
public class MyPlugin extends CordovaPlugin{
private static final String TAG = "MyPlugin";
static MyPlugin instance = null;
static CordovaWebView cordovaWebView;
static CordovaInterface cordovaInterface;
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
instance = this;
cordovaWebView = webView;
cordovaInterface = cordova;
}
@Override
public void onDestroy() {
instance = null;
}
private static void executeGlobalJavascript(final String jsString) {
if (instance == null) {return;}
instance.cordovaInterface.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
try {
instance.cordovaWebView.loadUrl("javascript:" + jsString);
} catch (Exception e) {
Log.e(TAG, "Error executing javascript: "+ e.toString());
}
}
});
}
public static void triggerJavascriptEvent(final String eventName){
executeGlobalJavascript(String.format("document.dispatchEvent(new Event('%s'));", eventName));
}
}
Тогда ваш фоновый сервис может вызвать открытый метод, предоставляемый этим классом плагина:
public class MyService {
public static void myMethod(){
MyPlugin.triggerJavascriptEvent("myserviceevent");
}
}
И, наконец, в слое JS вашего приложения Cordova вы будете прослушивать собственное событие:
document.addEventListener('myserviceevent', function(){
console.log("myserviceevent received");
}, false);
Я создал пример проекта Cordova, который содержит минимальные пользовательские плагины, необходимые для достижения этой цели, которые вы можете скачать здесь: http://ge.tt/8UeL6lu2
После загрузки распакуйте, а затем:
cd cordova-test
cordova platform add android
cordova run android