網上關於HTML5規範定稿的一篇看法文章:javascript
http://www.csdn.net/article/2014-11-06/2822513-how-html5-changescss
本篇主要基於這段時間對WebView的使用經驗和網上學習到的對WebView開發作一個要點小結:html
1、WebView基於webkit引擎展示web頁面的控件,使用前需要在Android Manifest file中配置internet訪問權限,不然提示頁面沒法訪問。html5
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </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); /** * 用WebView顯示圖片,可以使用這個參數 設置網頁佈局類型: * 一、LayoutAlgorithm.NARROW_COLUMNS :適應內容大小 * 二、LayoutAlgorithm.SINGLE_COLUMN : 適應屏幕,內容將本身主動縮放 */ webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); webSettings.setUseWideViewPort(true); mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); mWebView.setHorizontalScrollbarOverlay(true); mWebView.setHorizontalScrollBarEnabled(true); mWebView.requestFocus();二、設置WebChromeClient子類
mWebView.setWebChromeClient(new MyWebChromeClient());三、設置WebViewClient子類
mWebView.setWebViewClient(new MyWebViewClient());四、設置addJavascriptInterface方法
3、設置當前網頁的連接仍在WebView中跳轉,而不是跳到手機瀏覽器裏顯示,
在WebViewClient的子類中重寫shouldOverrideUrlLoading函數 代碼例如如下:java
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });shouldOverrideUrlLoading表示當前webView中的一個新url需要載入時,給當前應用程序一個處理機會,假設沒有重寫此函數,webView請求ActivityManage選擇合適的方式處理請求,就像彈出uc和互聯網讓用戶選擇瀏覽器同樣。重寫後return true表示讓當前程序處理,return false表示讓當前webView處理
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, "<span style=\"color:#FF0000\">網頁載入失敗</span>", "text/html", "utf-8", null); } });5、處理https請求,爲WebView處理ssl證書設置
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); } } });onProgressChanged通知應用程序當前頁面載入的進度
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.canGoBack()在webView含有一個可後退的瀏覽記錄時返回true
8、使用addJavascriptInterface完畢和js交互
一、Js中調Native本地Java方法
設置webView的addJavascriptInterface方法,該方法有兩個參數,第一個參數爲被綁定到js中的類實例,第二個參數爲在js中暴露的類別名,在js中引用java對象就是用這個名字
在Native Java代碼例如如下:
android
mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android"); class JavaScriptInterface{ Context mContext; /** Instantiate the interface and set the context */ JavaScriptInterface(Context c) { mContext = c; } /** Show a toast from the web page * 由Js調用運行Native本地Java方法 */ @JavascriptInterface public void showToast(String toast) { Log.d("TAG", "Js Invoker Native Function"); Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }在HTML中Js調用Native方法 代碼例如如下:
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>二、Java調Js方法
<script type="text/javascript"> function showAlert() { alert("Be executed by Native"); } </script>在Native調Js方法例如如下:
mWebView.loadUrl("javascript:showAlert()");
WebSettings webSettings = mWebView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); //設置 緩存模式 // 開啓 DOM storage API 功能 webSettings.setDomStorageEnabled(true); //開啓 database storage API 功能 webSettings.setDatabaseEnabled(true);
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);
public void int () { if(Build.VERSION.SDK_INT >= 19) { webView.getSettings().setLoadsImagesAutomatically(true); } else { webView.getSettings().setLoadsImagesAutomatically(false); } }同一時候在WebView的WebViewClient子類中重寫onPageFinished()方法加入例如如下代碼:
@Override public void onPageFinished(WebView view, String url) { if(!webView.getSettings().getLoadsImagesAutomatically()) { webView.getSettings().setLoadsImagesAutomatically(true); } }從上面的代碼,可以看出咱們對系統API在19以上的版本號做了兼容。因爲4.4以上系統在onPageFinished時再恢復圖片載入時,假設存在多張圖片引用的是一樣的src時,會僅僅有一個image標籤獲得載入,於是對於這種系統咱們就先直接載入。
11、WebView硬件加速致使頁面渲染閃爍問題解決方法
關於Android硬件加速 開始於Android 3.0 (API level 11),在四個級別上開啓/關閉硬件加速
一、Application級別:爲整個應用程序開啓硬件加速,在AndroidManifest中增長例如如下配置web
<application android:hardwareAccelerated="true" ...>二、Activity級別:控制每個activity是否開啓硬件加速,僅僅需在activity元素中加入android:hardwareAccelerated屬性就能夠
<activity android:hardwareAccelerated="true" ...>三、Window級別:注:眼下還不支持在Window級別上關閉硬件加速
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);四、View級別:執行時單個view硬件加速,眼下Android還不支持在View級別開啓硬件加速 代碼例如如下:
mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
[//TODO 關於Android硬件加速 小呂有時間會更具體的單獨整理成一篇來作介紹
先提供學習地址:http://android.toolib.net/guide/topics/graphics/hardware-accel.html]
咱們開啓硬件加速後,WebView渲染頁面更加高速,拖動也更加順滑。但有個反作用就是easy會出現頁面載入白塊同一時候界面閃爍現象。解決問題的方法是設置WebView臨時關閉硬件加速 代碼例如如下:
數據庫
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
12、WebView載入本地HTML文件亂碼問題解決方式
分析1、保證html頁面有設置編碼格式 如: api
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
分析2、爲WebView 指定顯示的編碼,WebView設置編碼是在Settings中來設置,如: 瀏覽器
mWebView.getSettings().setDefaultTextEncodingName("utf-8");分析3、假設你是使用的loadData()來載入顯示網頁。中文出現亂碼 則改成loadDataWithBaseURL
//webview.loadData(data, "text/html", "utf-8"); webview.loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", failUrl);
十3、其它注意事項:
1> 從網絡上下載html頁面的過程應放在工做線程(後臺線程)中 2> html下載成功後渲染出html的步驟應放在UI主線程,否則WebView載入網頁過程會easy報錯