国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安卓中WebView的使用

2019-11-09 16:02:19
字體:
來源:轉載
供稿:網友

WebView

目前android市場上的一些應用采用的開發方式大致分為三種:

> Native App - 用原生的Android控件開發出來的應用> Web App - 使用網頁開發的應用> Hybrid App - 混合式的應用,原生的控件和網頁混合開發

Hybrid App中實現的主要技術native組件javascript的數據交互以及實現。

概覽:

Android WebView在Android平臺上是一個特殊的View, 他能用來顯示網頁, 這個類可以被用來在你的app中僅僅顯示一張在線的網頁,還可以用來開發瀏覽器。

WebView內部實現是采用渲染引擎(Webkit)來展示view的內容,提供網頁前進后退,網頁放大,縮小,搜索,前端開發者可以使用web inspector(Android 4.4系統支持,4.4一下可以采用 http://developer.android.com/guide/webapps/debugging.html)調試HTML,CSS,Javascript等等功能。

在Android 4.3系統及其以下WebView內部采用 Webkit 渲染引擎,在Android 4.4采用 chromium 渲染引擎來渲染View的內容。

WebView的基本使用

創建WebView的實例加入到Activity view tree中 WebView webview = new WebView(this); setContentView(webview); 在layout xml中配置WebView<Webview id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" > </Webview>

在代碼中:

WebView webView = (WebView)findViewById(R.id.webview)

訪問網頁

載入互聯網網頁:

webview.loadUrl("http://developer.android.com/");

載入應用中的網頁,有一個網頁在assets:

webView.loadUrl("file:///android_asset/page.html");

添加權限,網絡訪問權限

<uses-permission android:name="android.permission.INTERNET" />

系統默認會通過手機瀏覽器打開網頁,為了能夠直接通過WebView顯示網頁,則必須設置:

webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });

WebView使用詳解

請求加載網頁

加載指定的data數據

public void loadData (String data, String mimeType, String encoding)

參數說明:

data 字符串String形式的數據 可以通過base64編碼而來,html格式字符串 Content-Type -> text/html; charset=ut-8 mineType data數據的 MIME類型 encoding data數據的編碼格式

提示: 1.Javascript有同源限制,同源策略限制了一個源中加載文本或者腳本與來自其他源中的數據交互方式。 避免這種限制可以使用loadDataWithBaseURL()方法。

2.encoding參數制定data參數是否為base64或者 URL 編碼,如果data是base64編碼那么 encoding必須填寫 “base64“。 官方文檔:http://developer.android.com/reference/android/webkit/WebView.html

其他方法:

public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl) 使用baseUrl加載base URL的網頁內容,baseUrl解決相關url使用Javascript相同源問題。

public void loadUrl (String url) 加載制定url的網頁內容

public void loadUrl (String url, Map

前進后退

public void goBack () 返回public void goForward () 前進public void goBackOrForward (int steps) 以當前的index為起始點前進或者后退到歷史記錄中指定的steps,如果steps為負數則為后退,正數則為前進public boolean canGoForward () 是否可前進public boolean canGoBack () 是否可返回

JavaScript操作

在webview添加對js的支持:

WebSettings setting = webView.getSettings(); setting.setJavaScriptEnabled(true);//支持js

public void addJavascriptInterface (Object object, String name) 當網頁需要和App進行交互時,可以注入Java對象提供給JavaScritp調用. Java對象提供相應的方法供js使用

提示(重要): 問題:在Android 4.2以下使用這個api會涉及到JavaScript安全問題,javascript可以通過反射這個java對象的相關類進行攻擊。

解決:可以采用白名單的機制調用這個方法

在Android4.2極其以上系統需要給提供js調用的方法前加入一個注視:@JavaScriptInterface; 在虛擬機當中 Javascript調用Java方法會檢測這個anotation,如果方法被標識@JavaScriptInterface則Javascript可以成功調用這個Java方法,否則調用不成功。

網頁查找功能

public int findAll (String find) 這個API在Android 4.1 就已經被去除, 在Android 4.1極其以上系統使用findAllAsync方法public void findAllAsync (String find) 異步執行查找網頁內包含的字符并設置高亮,查找結果會回調.public void findNext (boolean forward) 查找下一個匹配的字符

數據清除

public void clearCache (boolean includeDiskFiles) 清除網頁訪問留下的緩存,由于內核緩存是全局的因此這個方法不僅僅針對webview而是針對整個應用程序.public void clearFormData () 這個api僅僅清除自動完成填充的表單數據,并不會清除WebView存儲到本地的數據。public void clearHistory () 清除當前webview訪問的歷史記錄,只會webview訪問歷史記錄里的所有記錄除了當前訪問記錄.public void clearMatches () 清除網頁查找的高亮匹配字符public void clearView () 在Android 4.3及其以上系統這個api被丟棄了, 并且這個api大多數情況下會有bug,經常不能清除掉之前的渲染數據。官方建議通過loadUrl(“about:blank”)來實現這個功能

WebView的狀態

public void onResume () 激活WebView為活躍狀態,能正常執行網頁的響應public void onPause () 當頁面被失去焦點被切換到后臺不可見狀態,需要執行onPause動過, onPause動作通知內核暫停所有的動作,比如DOM的解析、plugin的執行、JavaScript執行。并且可以減少不必要的CPU和網絡開銷,可以達到省電、省流量、省資源的效果。public void pauseTimers () 當應用程序被切換到后臺我們使用了webview, 這個方法不僅僅針對當前的webview而是全局的全應用程序的webview,它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。public void resumeTimers () 恢復pauseTimers時的動作。public void destroy () 這個方法必須在webview從view tree中刪除之后才能被執行, 這個方法會通知native釋放webview占用的所有資源。

WebView 事件回調監聽

public void setWebChromeClient (WebChromeClient client) 主要通知客戶端app加載當前網頁的 title,Favicon,PRogress,javascript dialog等事件,通知客戶端處理這些相應的事件。public void setWebViewClient (WebViewClient client) 主要通知客戶端app加載當前網頁時的各種時機狀態,onPageStart,onPageFinish,onReceiveError等事件。

例:

package com.example.webviewdemo; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.os.Message; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewBase extends WebView { private static final String DEFAULT_URL = "http://www.baidu.com/"; private Activity mActivity; public WebViewBase(Context context) { super(context); mActivity = (Activity) context; init(context); } @SuppressLint("SetJavaScriptEnabled") private void init(Context context) { WebSettings webSettings = this.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); //webSettings.setUseWideViewPort(true); this.setWebViewClient(mWebViewClientBase); this.setWebChromeClient(mWebChromeClientBase); this.loadUrl(DEFAULT_URL); this.onResume(); } private WebViewClientBase mWebViewClientBase = new WebViewClientBase(); private class WebViewClientBase extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub return super.shouldOverrideUrlLoading(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { // TODO Auto-generated method stub super.onPageFinished(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } @Override public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) { // TODO Auto-generated method stub super.doUpdateVisitedHistory(view, url, isReload); } } private WebChromeClientBase mWebChromeClientBase = new WebChromeClientBase(); private class WebChromeClientBase extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { mActivity.setProgress(newProgress * 1000); } @Override public void onReceivedTitle(WebView view, String title) { // TODO Auto-generated method stub super.onReceivedTitle(view, title); } @Override public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) { // TODO Auto-generated method stub super.onReceivedTouchIconUrl(view, url, precomposed); } @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { // TODO Auto-generated method stub return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } } }

Android 5.0Lollipop新API

public static void enableSlowWholeDocumentDraw () Android 5.0 Webview默認提供減少內存占用支持,并且智能選擇需要繪制的HTML document部門來提供性能。當然開發者可以在自己應用程序需要時關閉這個選項(enableSlowWholeDocumentDraw)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 额敏县| 冕宁县| 梁山县| 四平市| 海门市| 井陉县| 潮安县| 安达市| 阳东县| 湖南省| 来宾市| 河间市| 丽江市| 海安县| 滁州市| 政和县| 宜君县| 金平| 同心县| 黎平县| 焉耆| 阿尔山市| 哈密市| 海南省| 侯马市| 克什克腾旗| 叙永县| 体育| 台州市| 永兴县| 博白县| 德江县| 合江县| 宁阳县| 徐水县| 天祝| 察哈| 齐齐哈尔市| 襄垣县| 梁河县| 肇东市|