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();
	}
}