android访问网页

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 style="white-space:pre">	</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 style="white-space:pre">	</span>});</span>

在webview.setWebViewClient(){ };这里面有很多方法可以用,根据需要选择,比如

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public boolean shouldOverrideUrlLoading(WebView view, String url)  
当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。

参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url    即将要被加载的url
@return  true 当前应用程序要自己处理这个url, 返回false则不处理。

Tips
(1) 当请求的方式是"POST"方式时这个回调是不会通知的。
(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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不一定每次都被调用,只有需要的时候才会被调用。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void onReceivedError(WebView view, int errorCode,  
  2.             String description, String failingUrl)  
当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。

参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param errorCode 错误号可以在WebViewClient.ERROR_* 里面找到对应的错误名称。
@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();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值