网上关于HTML5规范定稿的一篇见解文章:
http://www.csdn.net/article/2014-11-06/2822513-how-html5-changes
本篇主要基于这段时间对WebView的使用经验和网上学习到的对WebView开发做一个要点小结:
一、WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问。
- <</span>manifest
... > -
<</span>uses-permission android:name="android.permission.INTERNET" /> -
... - </</span>manifest>
- WebSettings
webSettings = mWebView.getSettings(); - webSettings.setJavaScriptEnabled(true);
- webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
- webSettings.setDomStorageEnabled(true);
- webSettings.setDatabaseEnabled(true);
- webSettings.setAppCacheEnabled(true);
- webSettings.setAllowFileAccess(true);
- webSettings.setSavePassword(true);
- webSettings.setSupportZoom(true);
- webSettings.setBuiltInZoomControls(true);
-
- webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
- webSettings.setUseWideViewPort(true);
-
- mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
- mWebView.setHorizontalScrollbarOv
erlay(true); - mWebView.setHorizontalScrollBarEn
abled(true); - mWebView.requestFocus();
- mWebView.setWebChromeClient(new
MyWebChromeClient());
- mWebView.setWebViewClient(new
MyWebViewClient());
三、设置当前网页的链接仍在WebView中跳转,而不是跳到手机浏览器里显示,
- webView.setWebViewClient(new
WebViewClient() { -
-
@Override -
public boolean shouldOverrideUrlLoading (WebView view, String url) { -
view.loadUrl(url); -
return true; -
} - });
四、设置开始加载网页、加载完成、加载错误时处理
- webView.setWebViewClient(new
WebViewClient() { -
-
@Override -
public void onPageStarted(WebView view, String url, Bitmap favicon) { -
super.onPageStarted(view, url, favicon); -
// 开始加载网页时处理 如:显示"加载提示" 的加载对话框 -
DialogManager.showLoadingDialog(this); -
} -
-
@Override -
public void onPageFinished(WebView view, String url) { -
super.onPageFinished(view, url); -
// 网页加载完成时处理 如:让 加载对话框 消失 -
DialogManager.dismissLoadingDialog(); -
} -
-
@Override -
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { -
super.onReceivedError(view, errorCode, description, failingUrl); -
// 加载网页失败时处理 如: -
view.loadDataWithBaseURL(null, -
"网页加载失败", -
"text/html", -
"utf-8", -
null); -
} - });
- webView.setWebViewClient(new
WebViewClient() { -
-
@Override -
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { -
handler.proceed(); // 接受信任所有网站的证书 -
// handler.cancel(); // 默认操作 不处理 -
// handler.handleMessage(null); // 可做其他处理 -
} - });
六、显示页面加载进度
- webView.setWebChromeClient(new
WebChromeClient() { -
-
public void onProgressChanged(WebView view, int progress) { -
setTitle("页面加载中,请稍候..." + progress + "%"); -
setProgress(progress * 100); -
-
if (progress == 100) { -
setTitle(R.string.app_name); -
} -
} - });
progress表示当前页面加载的进度,为1至100的整数
七、back键控制网页后退
- public
boolean onKeyDown(int keyCode, KeyEvent event) { -
if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { -
webView.goBack(); -
return true; -
} -
return super.onKeyDown(keyCode, event); - }
webView.goBack();表示返回至webView的上次访问页面
八、使用addJavascriptInterface完成和js交互
1、Js中调Native本地Java方法
在Native Java代码如下:
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.addJavascriptInterface(new
JavaScriptInterface(this), "Android"); -
- class
JavaScriptInterface{ -
-
Context mContext; -
-
-
JavaScriptInterface(Context c) { -
mContext = c; -
} -
-
-
@JavascriptInterface -
public void showToast(String toast) { -
Log.d("TAG", "Js Invoker Native Function"); -
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); -
} -
- }
- <</span>input
type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> -
- <</span>script
type="text/javascript"> -
function showAndroidToast(toast) { -
Android.showToast(toast); -
} - </</span>script>
比如在HTML中有如下Js函数
- "text/javascript">
-
function showAlert() { -
alert("Be executed by Native"); -
} -
- mWebView.loadUrl("javascript:showAlert()");
九、WebView缓存模式的设置
1、网页数据缓存
当使用WebView加载HTML网页时,会在我们data/应用package下生成database与cache两个文件夹:
我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.
五种缓存模式的设置setCacheMode:
LOAD_CACHE_ONLY:
LOAD_DEFAULT:
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据。
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
如示例代码:
- WebSettings
webSettings = mWebView.getSettings(); - webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
//设置 缓存模式 - //
开启 DOM storage API 功能 - webSettings.setDomStorageEnabled(true);
- //开启
database storage API 功能 - webSettings.setDatabaseEnabled(true);
2、H5缓存
通过setAppCacheEnabled(boolean flag)设置H5的缓存是否打开,默认关闭。
根据setAppCachePath(String appCachePath)提供的路径,在H5使用缓存过程中生成的缓存文件。
通过setAppCacheMaxSize(long appCacheMaxSize)设置缓存最大容量。
如示例代码:
- String
cacheDirPath = getCacheDir().getAbsolutePath()+ "/webViewCache "; - WebSettings
webSettings = mWebView.getSettings(); - //开启
database storage API 功能 - webSettings.setDatabaseEnabled(true);
- //设置数据库缓存路径
- webSettings.setDatabasePath(cacheDirPath);
- //开启Application
H5 Caches 功能 - webSettings.setAppCacheEnabled(true);
- //设置Application
Caches 缓存目录 - webSettings.setAppCachePath(cacheDirPath);
十、加快HTML网页加载完成速度
- public
void int () { -
if(Build.VERSION.SDK_INT >= 19) { -
webView.getSettings().setLoadsImagesAutomatica lly(true); -
} else { -
webView.getSettings().setLoadsImagesAutomatica lly(false); -
} - }
- @Override
- public
void onPageFinished(WebView view, String url) { -
if(!webView.getSettings().getLoadsImagesAutomatica lly()) { -
webView.getSettings().setLoadsImagesAutomatica lly(true); -
} - }
十一、WebView硬件加速导致页面渲染闪烁问题解决方法
- <</span>application
android:hardwareAccelerated="true" ...>
- <</span>activity
android:hardwareAccelerated="true" ...>
- getWindow().setFlags(
-
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, -
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- mView.setLayerType(View.LAYER_TYPE_SOFTWARE,
null);
- if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { -
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); - }
十二、其他注意事项: