我目前正在为平板电脑开发一个 android 应用程序,我想涵盖用例:"如果没有互联网连接,我希望应用程序正常运行"。
我使用 web 视图在应用程序中加载调查,因此一旦安装在我们的商店中,我就不必在每次需要新的改造或添加问题时安装新版本。
为了涵盖没有连接的情况,当我需要加载网页时,如果没有wifi,我会保存一个webArchive。
private void setMainView() {
mainview = (WebView) findViewById(R.id.wvMain);
WebSettings webSettings = mainview.getSettings();
webSettings.setLightTouchEnabled(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this);
mainview.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");
if (DetectConnection.checkInternetConnection(this)){
mainview.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
File webpage = new File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath()+ File.separator +"home.mht");
mainview.saveWebArchive(webpage.toString());
editor.putString(BuildConfig.HOME_PAGE_WEB_ARCHIVE_FILE,webpage.toString() );
editor.commit();
}
});
mainview.loadUrl(BuildConfig.SERVER_URL + BuildConfig.HOME_PAGE);
}
else{
String filename = getSharedPreferences(BuildConfig.PREFERENCES_NAME, 0).getString(BuildConfig.HOME_PAGE_WEB_ARCHIVE_FILE,null);
mainview.setWebChromeClient(new WebChromeClient());
mainview.loadUrl("file:///"+filename);
}
}
唯一的问题是网络存档在加载后立即冻结。我尝试了很多东西来让它工作,但解决方案正在逃避我。
当我将应用程序设置为平面模式并重新加载应用程序时,我看到主页正常,但单击事件不起作用。我的 Android Javascript 界面也无法正常工作,因为我测试在应用程序完成加载时发送 Toast 进行调试,所以我猜 javascript 在我的 webarchive 中不起作用,或者 webarchive 不包括来自其他网站(如 W3.css 和 JQuery(的 CSS 和 Javascript?
也许如果我使用这些资产的本地版本,它们将被包含在网络存档中。
欢迎任何建议。
谢谢
我最终使用了我的 webview 的缓存而不是加载 web 存档。
我首先添加了一个cache.appcache,我的网页的根目录将我的主页链接到它。
<html manifest="cache.appcache">
在根目录(wwww/http_doc(我添加了这个文件:
CACHE MANIFEST
/home
/thank-you
/css/w3.css
/js/jquery-3.3.1.min.js
/images/happy1.png
/images/happy2.png
/favicon.ico
#NETWORK
NETWORK:
/home
/thank-you
#FALLBACK
FALLBACK:
/home /offline.html
/thank-you /offline_thankyou.html
回退部分允许有一个 html 文件,如果网络可用。然后我激活了我的网络视图的缓存:
WebSettings webSettings = mainview.getSettings();
webSettings.setAppCacheEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setAppCachePath(
getApplicationContext().getCacheDir().getAbsolutePath());
现在,每次我修改文件"cache.appcache"并重新加载应用程序,它会复制当前"离线.html"文件并根据缓存重新加载工作站点。一件好事,我有一个非常静态的网站要加载,所以在没有互联网连接的情况下它是 100% 正常运行的。