1.通过Intent的方式访问浏览器
Uri uri= Uri.parse("http://www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW, myBlogUri);
startActivity(intent);
2.通过WebView跳转自带的浏览器。
用户能明显感觉在跳转自己手机上的浏览器,通过Intent是用浏览器,但是没有跳转的感觉。
WebView web;
String url = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
web = (WebView) findViewById(R.id.webView1);
web.loadUrl(url);
}
3.通过WebView,但是用户感觉不到跳转
在2中的内容上加上web.setWebViewClient(new WebViewClient() );这样实现的效果就是用户感觉不到跳转,这样用户就以为是你自己软件里面的东西了。
这三种方式都可以实现在android的app上访问网页的功能,但是各有各的特点,总的来说,1和2都是用的手机自带的浏览器,因为浏览器是一个成熟的app,里面肯定做了很多优化的功能,所以访问网页流畅,图片很快就能刷新出来,缺点就是让用户觉得自己使用你的软件,却直接在调用其他的浏览器,用户体验不佳。不过我的体会,第一种方式在少数访问网页的情况下是可以这样做的。
第三种方式访问网络,免去了自己布局和网络请求再解析,同时用户也不会觉得工程师偷懒,在使用其他软件,这就是3的优点,但是不好的是,如果没有进行优化。会出现加载速度会慢很多,图片资源难以加载等等问题,这些都是需要自己去设置属性或者找办法解决的。
WebView控件:
//设置可自由缩放网页
webview.getSettings().setSupportZoom(true);
webview.getSettings().setBuiltInZoomControls(true);
几种加速WebView加载的方法
· 提高渲染的优先级
[java]
webView.getSettings().setRenderPriority(RenderPriority.HIGH);
· 使用webView.getSettings().setBlockNetworkImage,把图片加载放在最后来加载渲染
[java]
webView.getSettings().setBlockNetworkImage(true);
// 希望点击链接继续在当前webview中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象
webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
// 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
view.loadUrl(url);
return true;
}
});
访问的时候可能会出现“net::ERR_UNKNOWN_URL_SCHEME”错误,这个时候代码:
<span > </span><span style="font-size:18px;">webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//webview访问出net::ERR_UNKNOWN_URL_SCHEME错的解决地方
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
}
return true;
}
<span > </span>});</span>
在webview.setWebViewClient(){ };这里面有很多方法可以用,根据需要选择,比如
1. public boolean shouldOverrideUrlLoading(WebView view, String url)
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
@return true 当前应用程序要自己处理这个url, 返回false则不处理。
Tips
(1) 当请求的方式是"POST"方式时这个回调是不会通知的。
(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。
1. public void onPageStarted(WebView view, String url, Bitmap favicon)
当内核
开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
@param favicon 如果这个favicon已经存储在本地数据库中,则会返回这个网页的favicon,否则返回为null。
Tips:
(1)iframe 我们加载的一张,下面有很多链接,我们随便点击一个链接是即当前host的一个iframe.
(2) 有个问题可能是开发者困惑的,onPageStarted和shouldOverrideUrlLoading 在网页加载过程中这两个函数到底哪个先被调用。
当我们通过loadUrl的方式重新加载一个网址时候,这时候会先调用onPageStarted再调用shouldOverrideUrlLoading,当我们在打开的这个网址点击一个link,这时候会先调用shouldOverrideUrlLoading 再调用onPageStarted。不过shouldOverrideUrlLoading不一定每次都被调用,只有需要的时候才会被调用。
1. public void onPageFinished(WebView view, String url)
当内核
加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
1. public void onReceivedError(WebView view, int errorCode,
2. String description, String failingUrl)
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param description 描述错误的信息
@param failingUrl 当前访问失败的url,注意并不一定是我们主url
Tips
在onReceiveError我们可以自定义网页的错误页面。
public class BActivity extends Activity {
WebView web;
String url = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
web = (WebView) findViewById(R.id.webView1);
web.getSettings().setBuiltInZoomControls(false);
web.getSettings().setJavaScriptEnabled(true);
web.getSettings().setRenderPriority(RenderPriority.HIGH);
web.getSettings().setBlockNetworkImage(true);
web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
web.getSettings().setAllowFileAccess(true);
web.getSettings().setAppCacheEnabled(true);
web.getSettings().setSaveFormData(false);
web.getSettings().setLoadsImagesAutomatically(true);
// WebView保留缩放功能但隐藏缩放控件:
web.getSettings().setSupportZoom(true);
web.getSettings().setBuiltInZoomControls(true);
web.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
BActivity.this.setTitle("Loading...");
BActivity.this.setProgress(progress * 100);
if (progress == 100)
BActivity.this.setTitle(R.string.app_name);
}
});
web.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//webview访问出net::ERR_UNKNOWN_URL_SCHEME错的解决地方
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
}
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Handle
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
});
web.loadUrl(url);
}
@Override
// 设置回退
// 覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack(); // goBack()表示返回WebView的上一页面
return true;
}
return false;
}
@Override
protected void onDestroy() {
web.destroy();
super.onDestroy();
}
}