目前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 = (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; } });加載指定的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
在webview添加對js的支持:
WebSettings setting = webView.getSettings(); setting.setJavaScriptEnabled(true);//支持jspublic 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方法,否則調用不成功。
例:
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); } } }public static void enableSlowWholeDocumentDraw () Android 5.0 Webview默認提供減少內存占用支持,并且智能選擇需要繪制的HTML document部門來提供性能。當然開發者可以在自己應用程序需要時關閉這個選項(enableSlowWholeDocumentDraw)。
新聞熱點
疑難解答