【发布时间】:2014-07-05 09:23:00
【问题描述】:
我正在开发在cordova 上开发的移动应用程序。我想实现一个后台服务,它可以做一些工作,比如打开套接字连接将本地数据库与远程数据库同步,并在新的远程推送时通知用户等。关键是我在 javascript 中实现了这段代码,但我想在后台执行它。
我在互联网上搜索了一个 cordova 后台服务插件。
-
我认为最好的是red-folder,但它只适用于android,它不允许我编写要在后台执行的javascript。但只是在 java 和 javascript 之间交换 json。
我已经阅读了一些关于 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 时工作正常,但是当涉及到 cordova 插件 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);
}
更新 logcat中没有错误。 所以我试图在屏幕上写设备对象,这就是我得到的:
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);
对这个问题有什么帮助吗?
【问题讨论】:
-
在我的情况下,javascript 被执行并继续运行,但问题是在后台执行 cordova plugin js。
-
能不能发个错误或者日志
-
@kirchberger 我更新了我的问题看上面我没有错误但设备对象为空
-
您是否按照我在回答中的建议考虑使用 Cordova WebView?在我看来,设备插件的 .js 只是初始化了一个空的设备对象,然后它调用了本机部分,但这会失败(默默地),因为标准的 WebView 没有处理程序。
标签: javascript android cordova mobile webview