目前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 = new WebView(this);
setContentView(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;
}
});
加载指定的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);//支持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方法,否则调用不成功。
例:
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)。