Я работаю над мобильным приложением, разработанным на cordova. Я хочу внедрить фоновый сервис, который выполняет некоторую работу, например, открывать соединение сокета, синхронизировать локальную базу данных с удаленным и уведомлять пользователей о новых удаленных нажатиях и т.д. Дело в том, что у меня этот код реализован в javascript, но я хочу выполнить его в фоновом режиме.
Я искал интернет для плагина поддержки кордовой связи.
- katzer/cordova-plugin-background-mode
- jocull/phonegap-backgroundjs
-
Самый лучший, который я считаю red-folder, но он просто для android, и он не позволяет мне писать javascript для выполнения в фоновом режиме. а просто обмен json между java и javascript.
Я прочитал несколько тем о фоновой службе в android, которые я нашел:
- create-a-service-on-android-with-phonegap-application
- simple-android-service-example-code-description-start-stop-service
- android-using-webview-outside-an-activity-context
Итак, я начал писать плагин cordova (в первую очередь на android), чтобы выполнить код javascript в фоновом режиме. Я создал webview из фоновой службы, чтобы выполнить javascript. Это отлично работает, когда я запускаю обычный javascript, но когда дело доходит до плагинов кордовой js, это не удается, например, устройство device.uuid
дает null
.
Это код службы java:
public void onStart(Intent intent, int startId) {
Toast.makeText(this, "My Happy Service Started", Toast.LENGTH_LONG).show();
createBackGroundView();
super.onStart(intent,startId);
}
public void createBackGroundView(){
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutParams params = new WindowManager.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 0;
params.width = 200;
params.height = 200;
LinearLayout view = new LinearLayout(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT
));
WebView wv = new WebView(this);
wv.setLayoutParams(new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT
));
view.addView(wv);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebChromeClient(new WebChromeClient());
wv.loadUrl("file:///android_asset/www/background.html");
wv.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(final WebView view, int errorCode,
String description, final String failingUrl) {
Log.d("Error","loading web view");
super.onReceivedError(view, errorCode, description, failingUrl);
}
});
windowManager.addView(view, params);
}
Обновление В логарифме нет ошибки. Поэтому я попытался написать объект устройства на экране, и вот что я получаю:
document.write(JSON.stringify(window.device))
И это результат:
{ available : false,
plaform : null ,
version : null ,
uuid : null ,
cordova : null ,
model : null
}
Я попытался заменить стандартный webView
на cordovaWebView
Но тот же результат дается.
//WebView wv = new WebView(this); Commented out
CordovaWebView wv = new CordovaWebView(this);
Любая помощь по этой проблеме?