Android混合開發(fā)教程之WebView的使用方法總結
前言:
今天修改項目中一個有關WebView使用的bug,激起了我總結WebView的動機,今天抽空做個總結。
簡介
WebView是一個基于webkit引擎、展現(xiàn)web頁面的控件。
Android的Webview在低版本和高版本采用了不同的webkit版本內核,4.4后直接使用了Chrome。
作用
- 顯示和渲染W(wǎng)eb頁面
- 直接使用html文件(網(wǎng)絡上或本地assets中)作布局
- 可和JavaScript交互調用
WebView控件功能強大,除了具有一般View的屬性和設置外,還可以對url請求、頁面加載、渲染、頁面交互進行強大的處理。

混合開發(fā)相關博客:
使用場景:
1.)添加權限
<uses-permission android:name="android.permission.INTERNET" />
2.)布局文件
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
3.)數(shù)據(jù)加載
加載本地資源
webView.loadUrl(file:///android_asset/example.html);
加載網(wǎng)絡資源
webView.loadUrl(www.xxx.com/index.html);
添加請求頭信息
Map<String,String> map=new HashMap<String,String>();
map.put("User-Agent","Android");
webView.loadUrl("www.xxx.com/index.html",map);
也可以加載html片段
String data = " Html 數(shù)據(jù)"; webView.loadData(data, "text/html", "utf-8");
實測會發(fā)現(xiàn)loadData會導致中文亂碼,所以一般情況使用如下代碼
String data = " Html 數(shù)據(jù)"; webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);
4.)支持JavaScript
比如項目總js觸發(fā)一個native函數(shù)關閉Activity
設置支持JavaScript
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//設置支持javascript webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
JavaScriptInterface 接口定義
public class JavaScriptInterface {
@android.webkit.JavascriptInterface
public void doTrainFinish() {
finish();
}
}
5.)設置WebViewClient 主要輔助WebView處理各種通知、請求事件
比如要實現(xiàn)WebView中鏈接在WebView內部跳轉
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
除此之外WebViewClient更多的處理網(wǎng)頁的地址的解析和渲染,例如
onLoadResource//加載資源時響應
onPageStart//在加載頁面時響應
onPageFinish//在加載頁面結束時響應
onReceiveError//在加載出錯時響應
onReceivedHttpAuthRequest//獲取返回信息授權請求
6.)設置WebChromeClient主要輔助WebView處理Javascript的對話框,網(wǎng)站圖標,網(wǎng)站title,加載進度等
比如加載進度獲取title
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
//網(wǎng)頁加載完成
} else {
//網(wǎng)頁加載中
}
}
});
除了上面檢測進度之外還有
onCloseWindow//關閉WebView
onCreateWindow() //觸發(fā)創(chuàng)建一個新的窗口
onJsAlert //觸發(fā)彈出一個對話框
onJsPrompt //觸發(fā)彈出一個提示
onJsConfirm//觸發(fā)彈出確認提示
onProgressChanged //加載進度
onReceivedIcon //獲取網(wǎng)頁icon
onReceivedTitle//獲取網(wǎng)頁title
7.)設置網(wǎng)頁棧返回
webview會默認把瀏覽過去的網(wǎng)頁進行壓棧存儲,所以我們有時需要實現(xiàn)回退到上一目錄
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView.canGoBack()) {
webView.goBack();//返回上一瀏覽頁面
return true;
} else {
finish();//關閉Activity
}
}
return super.onKeyDown(keyCode, event);
}
8.)WebView 緩存控制
- LOAD_CACHE_ONLY: 不使用網(wǎng)絡,只讀取本地緩存數(shù)據(jù)
- LOAD_DEFAULT: 根據(jù)cache-control決定是否從網(wǎng)絡上取數(shù)據(jù)。
- LOAD_CACHE_NORMAL: API level 17中已經(jīng)廢棄, 從API level 11開始作用同LOAD_DEFAULT模式
- LOAD_NO_CACHE: 不使用緩存,只從網(wǎng)絡獲取數(shù)據(jù).
- LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用緩存中的數(shù)據(jù)。
WebSettings webSettings = webView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
9.)WebView屏幕自適應
WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true);
10.)其他不常用設置
WebSettings webSettings = webView.getSettings(); webSettings.setSupportZoom(true); //支持縮放 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持內容重新布局 webSettings.supportMultipleWindows(); //多窗口 webSettings.setAllowFileAccess(true); //設置可以訪問文件 webSettings.setNeedInitialFocus(true); //當webview調用requestFocus時為webview設置節(jié)點 webSettings.setBuiltInZoomControls(true); //設置支持縮放 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口 webSettings.setLoadsImagesAutomatically(true); //支持自動加載圖片
11.)知識擴展WebViewJSBridge
雖然谷歌也提供了js與native函數(shù)互相調用的方式,但是通過addjavascriptInterface這種方式在Android 4.2以下版本存在一定的安全隱患,在Android 4.2以上也需要加@JavascriptInterface注解,否則無法調用?;谏厦娴脑蚪ㄗh學習一下
WebViewJSBridge這個比較不錯的開源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge
12.)硬件加速
開啟硬件加速強制使用GPU渲染,確實給app流暢度帶來不小的提升,但是在使用過程中遇見webview閃爍,也有導致加載webView黑屏或者白屏
解決辦法:關閉硬件加速
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
這是把webview 中的硬件加速關閉。設置LAYER_TYPE_SOFTWARE后會把當前view轉為bitmap保存。這樣就不能開多個webview,否則會報out of memory。
需要在在webview中加入如下代碼
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
invalidate();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
干我們這行,啥時候懈怠,就意味著長進的停止,長進的停止就意味著被淘汰,只能往前沖,直到鳳凰涅槃的一天!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Android?無障礙服務?performAction?調用過程分析
這篇文章主要介紹了Android?無障礙服務?performAction?調用過程分析,無障礙服務可以模擬一些用戶操作,無障礙可以處理的對象,通過類?AccessibilityNodeInfo?表示,通過無障礙服務,可以通過它的performAction方法來觸發(fā)一些action2022-06-06
淺談Android手機聯(lián)系人開發(fā)之增刪查改功能
這篇文章主要介紹了Android手機聯(lián)系人開發(fā)之增刪查改功能,需要的朋友可以參考下2017-05-05
Android Studio gradle配置packagingOptions打包so庫重復
這篇文章主要為大家介紹了Android Studio gradle配置packagingOptions打包so庫重復問題的解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Android開發(fā)手冊TextView控件及陰影效果實現(xiàn)
這篇文章主要為大家介紹了Android開發(fā)手冊TextView控件及陰影效果的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

