webview功能介绍,以及利用缓存节省流量

原文:http://ping8080.iteye.com/blog/1019362

webview总结:

1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。

在Androidmanifest.xml文件中添加
  
<uses-permission android:name="android.permission.INTERNET" /> 
</manifest>

2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
    3、设置WebView基本信息:
          如果访问的页面中有Javascript,则webview必须设置支持Javascript。
          webview.getSettings().setJavaScriptEnabled(true);  
          触摸焦点起作用
          requestFocus();
          取消滚动条
          this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
    4、设置WevView要显示的网页:
          互联网用:webView.loadUrl("http://www.google.com"); 
          本地文件用:webView.loadUrl(file:///android_asset/xx.html);固定格式

    本地文件存放在:assets文件中

  
    5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
          给WebView添加一个事件监听对象(WebViewClient)      
        
          并重写其中的一些方法
                shouldOverrideUrlLoading:对网页中超链接按钮的响应。
                                          当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url 
                onLoadResource   
                onPageStart  
                onPageFinish  
                onReceiveError
                onReceivedHttpAuthRequest
          

    6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
       覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

 

public boolean onKeyDown(int keyCoder,KeyEvent event){
                      if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                              webview.goBack();   //goBack()表示返回webView的上一页面
 
                              return true;
                      }
                      return false;
              }

 

 

webview控件返回事件 :

webView.setOnKeyListener(new View.OnKeyListener() {
   @Override
   public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
     if ((keyCode == KeyEvent.KEYCODE_BACK)
       && webView.canGoBack()) {
      webView.goBack();
      return true;
     }     
    }
    return false;
   }
  });

 

 

 

 

 

  String strURI = ("file:///android_asset/first/first.html");   //本地文件
// String strURI="http://www.baidu.com";    //网络文件

 //String strURI="content://com.android.htmlfileprovider/sdcard/index.html";  //打开本地sd卡内的index.html文件


  final WebView mWebView;
  mWebView = new WebView(this);  
  mWebView.loadUrl(strURI); 

 

 

mWebView.setWebViewClient(new WebViewClient() {

   // 得到请求时的错误 提示
   public void onReceivedError(WebView view, int errorCode,
     String description, String failingUrl) {
    System.out.println("2222222222222222222222222222222"
      + errorCode);
    
   }

   // 打开连接前的事件
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    mWebView.loadUrl(strURI1);
    return false;
    
   }
 
 });

 

 

 

 

webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);//滚动条风格
  setContentView(webView);
  webView.setWebViewClient(new ViewClient());
  webView.getSettings().setJavaScriptEnabled(true);//js可用
  webView.getSettings().setPluginsEnabled(true);//设置支持flash插件
  webView.getSettings().setLoadsImagesAutomatically(true); //自动加载图片 
  webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//设置缓存模式
  webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);//设置页面固定大小
  webView.getSettings().setBuiltInZoomControls(true); //支持多点触摸


原文:http://androiddada.iteye.com/blog/1280946

在做Webview显示服务器的html功能时 需要加入离线功能。

http://androiddada.iteye.com/

开始思路很狭隘,以为一定应该是从服务器得到的html文件,下载到本地后加载~

但是这样不能离线查看图片,因为图片数据并不再html中,只是连接地址。

后来,经过上网各种搜寻学习,发现原来Webview有自己的缓存,如图:

 



 在手机本地 data/data/包名/cache/webviewCache 中放的是Webview显示过的图片。我们可以把它导出,后缀改成对应图片的格式 打开看看~

 

而databases中的webviewCache.db 中放的就是图片地址和图片名字对应等信息 的表~ 导出后也可用SQLite Database Browser 等工具查看

 

1.优先缓存 

好了,这里你是不是想问:既然这些图片已经存在手机缓存里面了,为什么Webview不能再把它显示出来呢?

这里我们需要设置下:

 

 

WebSettings webSettings= webView.getSettings();

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 默认不使用缓存!

 

LOAD_CACHE_ELSE_NETWORK的意思是:

 

Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network. Use withsetCacheMode(int).

如果内容已经存在cache 则使用cache,即使是过去的历史记录。如果cache中不存在,从网络中获取!

 

所以加上这句,不仅可以使用cache离线显示用户浏览过的内容,还可以在有网络的情况下优先调用缓存,为用户减少流量!~

 

我有些费解的是,这个设置在我看来是很有利于用户体验的 为什么google不把它设置成默认的呢? 还需要开发者手动打开。猜想可能是因为相同页面可能会更新的原因!

 

如果离线加载出现乱码 可参考: http://androidturing.iteye.com/blog/1280656

 

http://androiddada.iteye.com/

2.缓存管理:

(1)clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.

 

 

Java代码   收藏代码
  1. // clear the cache before time numDays    
  2. private int clearCacheFolder(File dir, long numDays) {     
  3. int deletedFiles = 0;     
  4. if (dir!= null && dir.isDirectory()) {     
  5. try {     
  6. for (File child:dir.listFiles()) {     
  7. if (child.isDirectory()) {     
  8. deletedFiles += clearCacheFolder(child, numDays);    
  9. }    
  10.     
  11. if (child.lastModified() < numDays) {     
  12. if (child.delete()) {     
  13. deletedFiles++;    
  14. }    
  15. }    
  16. }    
  17. catch(Exception e) {     
  18. e.printStackTrace();    
  19. }    
  20. }    
  21. return deletedFiles;     
  22. }    

 

(2) 退出应用前删除缓存的方法!

 

 

Java代码   收藏代码
  1. File file = CacheManager.getCacheFileBaseDir();    
  2.   if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete();    
  3.   }    
  4.   file.delete();    
  5.   }    
  6.   context.deleteDatabase("webview.db");    
  7.   context.deleteDatabase("webviewCache.db"); 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值