WebView是Android系統(tǒng)提供的一個(gè)基于WebKit的web框架,可以讓開(kāi)發(fā)者將網(wǎng)頁(yè)嵌入自己的應(yīng)用中,實(shí)現(xiàn)在應(yīng)用中顯示網(wǎng)頁(yè)的功能。使用WebView可以在應(yīng)用內(nèi)展示網(wǎng)頁(yè),讓用戶直接在應(yīng)用內(nèi)訪問(wèn)某些特定網(wǎng)站,同時(shí)也可用于實(shí)現(xiàn)Hybrid應(yīng)用,使得應(yīng)用可以像網(wǎng)頁(yè)一樣動(dòng)態(tài)加載內(nèi)容并改變界面。下面是對(duì)使用WebView構(gòu)建APP的原理和詳細(xì)介紹。
一、原理
WebView是一個(gè)簡(jiǎn)單的組件,它可以方便地展示W(wǎng)eb頁(yè)面,并支持JavaScript與Android 互通交互。它的實(shí)現(xiàn)原理大致如下:
1.在應(yīng)用的布局文件中添加一個(gè)WebView控件。
2.使用WebView控件加載Web頁(yè)面。
3.當(dāng)WebView控件加載Web頁(yè)面時(shí),會(huì)啟動(dòng)另一個(gè)進(jìn)程,在該進(jìn)程中靜態(tài)生成WebViewCore對(duì)象,WebViewCore對(duì)象負(fù)責(zé)構(gòu)建WebView渲染的視圖樹(shù)。
4.當(dāng)Web頁(yè)面上的內(nèi)容需要被繪制時(shí),WebView控件會(huì)通過(guò)IPC與WebViewCore進(jìn)程通信,讓W(xué)ebViewCore計(jì)算出渲染樹(shù)的所有元素位置,將渲染的結(jié)果回傳給WebView控件。
5.WebView控件將渲染樹(shù)繪制到屏幕上完成頁(yè)面的展示。
通過(guò)上述原理可以了解到,WebView使用了多進(jìn)程的架構(gòu)來(lái)實(shí)現(xiàn)與瀏覽器的集成,同時(shí),由于WebView獨(dú)立的渲染進(jìn)程,它具有足夠的安全性,即使Web內(nèi)容受到攻擊,也不會(huì)波及到主進(jìn)程,提高了應(yīng)用的安全性。
二、詳細(xì)介紹
1. 創(chuàng)建WebView控件
創(chuàng)建WebView控件的方式有兩種:
①在XML文件中定義WebView:
```
android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` ②在Java代碼中創(chuàng)建WebView: ``` WebView webView = new WebView(context); Layout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); webView.setLayoutParams(params); ``` 2. 加載Web頁(yè)面 WebView的常用方法有l(wèi)oadUrl(String url)和loadData(String data, String mimeType, String encoding)。 ①loadUrl方法加載Web頁(yè)面: ``` webView.loadUrl("https://www.baidu.com"); ``` ②loadData方法加載Web頁(yè)面: ``` String htmlData = "Hello,World!
";
webView.loadData(htmlData,"text/html","utf-8");
```
3. WebView的設(shè)置
設(shè)置WebView的方法有很多,這里只介紹幾個(gè)比較常用的方法:
①啟用JavaScript:
```
webView.getSettings().setJavaScriptEnabled(true);
```
②加載進(jìn)度的監(jiān)聽(tīng):
```
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
//newProgress為加載進(jìn)度,從0~100
}
});
```
③ WebViewClient的設(shè)置:
```
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//重定向的url
webView.loadUrl(url);
return true;
}
});
```
上述代碼中,shouldOverrideUrlLoading方法用于攔截WebView中的url地址,進(jìn)行處理后再進(jìn)行頁(yè)面的加載。
4. Web頁(yè)面與Android互通
當(dāng)Web頁(yè)面需要與Android交互時(shí),可以使用JavaScript與WebView進(jìn)行通信。通過(guò)WebView的addJavaScriptInterface(Object object, String name)方法,可以將Android中的一個(gè)Java對(duì)象向?yàn)g覽器中的JavaScript對(duì)象傳遞,并通過(guò)調(diào)用該對(duì)象中的方法實(shí)現(xiàn)與瀏覽器的交互。
```
webView.addJavascriptInterface(new AndroidInterface(), "android");
class AndroidInterface{
@JavascriptInterface
void callAndroid(){
//Android代碼具體實(shí)現(xiàn)
}
}
```
在上述代碼中,AndroidInterface是Android中的Java對(duì)象,在瀏覽器JavaScript對(duì)象中被調(diào)用時(shí),會(huì)在必要時(shí)調(diào)用JavaScript接受的回調(diào)方法。
總之,使用WebView可以方便地在應(yīng)用中展示W(wǎng)eb頁(yè)面,同時(shí)也可以實(shí)現(xiàn)Web頁(yè)面與Android之間的交互,讓客戶端應(yīng)用在用戶交互和界面方面更加優(yōu)秀。