Android培训

亿元级外企Android培训企业

  • 全国服务监督电话4001118989
  • Android WebView知识点总结

    发布:Android培训  来源:Android教程  时间: 2017年05月18日

  • Android WebView知识点总结...

  • Android WebView

    github

    项目中用到的webview的东西比较多,在这里总结一下。
    权限
    在AndroidManifest.xml中添加网络访问权限:
    "android.permission.INTERNET"
    设置WebView要显示的网页
    互联网用:webView.loadUrl("http://www.google.com");
    本地文件用:webView.loadUrl("file:///android_asset/XX.html");
    函数
    addJavascriptInterface:提供js可以调用的函数接口(addJavascriptInterface可能导致不安全,因为JS可能包含恶意代码)
    setJavaScriptEnable:设置可以访问javaScript
    setBuiltInZoomControls:设置可以缩放onKeyDown(intkeyCoder,KeyEventevent):处理back键

    publicbooleanonKeyDown(intkeyCoder,KeyEventevent){
    if(webView.canGoBack()&&keyCoder==KeyEvent.KEYCODE_BACK{
    webview.goBack();//goBack()表示返回webView的上一页面
    returntrue;
    }
    returnfalse;
    }
    加载网页的方式
    loadUrl():webView.loadUrl("http://www.baidu.com");
    loadData():webView.loadUrl("file:///android_asset/xx.html");
    loadData(Stringdata,StringmimeType,Stringencoding):data为html代码内容

    Stringsummary="<html><body>Youscored<b>192</b>points.</body</html>"
    webview.loadData(summary,"text/html","UTF-8");
    PS:最后一种有时候会显示为乱码,应该是编码的问题,可以把string的内容也变为utf-8的编码,统一编码格式,就不会乱码了,如下:

    data=newString(data.getBytes(),"utf-8");
    WebViewClient
    onPageStarted:页面开始加载时
    onPageFinished:页面加载结束时
    onReceivedHttpAuthRequestonReceivedError:加载失败时,可以设置加载失败时reload
    shouldOverrideUrlLoading:拦截url跳转,在里边添加点击链接跳转或者操作
    onLoadResource:加载资源shouldInterceptRequest:拦截资源URl
    使用场景
    onPageStarted:当你想在页面加载开始的时候做一些事情,比如如果我要计算加载网页到底用了多久,会在start的时候记录一下开始时间
    onPageFinished:同理,结束的时候记录一下结束时间。还可以在结束的时候打印网页的内容。另外一个就是,可以在finish之后对webview做resize。
    onReceivedError:加载错误的时候,可以reload(),在请求加载一次,或者提示404的错误页面。
    shouldOverrideUrlLoading:举一个例子,比如你的webview中加了文章外链,但是这个链接其实在本地客户端里边是有的,所以在网页的时候需要直接跳转到网页,在客户端打开的时候,要转成本地的。那么在客户端里就可以处理拦截一下url,如下:
    Stringstr="http://www.xx.com/article/";
    if(url.contains(str)){
    String[]urls=url.split(str);
    Stringid=urls[1];//然后根据id进行本地跳转...
    }
    shouldInterceptRequest:比如,如果你的app有离线下载的话,那么本来img标签里边的图片链接是http://xxx.png的,离线打开的时候应该是加载本地下载好的图片,那么,这个时候就要用到这个函数了,读取本地图片文件转换为InputStream传到WebResourceResponse作为返回值,需要拦截一下资源的链接,那我们举个简单的栗子:
    @Override
    publicWebResourceResponseshouldInterceptRequest(WebViewview,Stringurl){
    if(!NetWorkCheckUtil.checkNet(context)&&url.contains(".png")){
    String[]urls=url.split("/");
    Stringimg=urls[urls.length-1];
    url=Environment.getExternalStorageDirectory().getAbsolutePath()+"/images/"+img;
    WebResourceResponseresponse=null;
    try{
    InputStreamlocalCopy=newFileInputStream(url);
    if(url.contains(".png")){
    response=newWebResourceResponse("image/png","UTF-8",localCopy);
    }
    }catch(IOExceptione){
    e.printStackTrace();
    }
    if(response!=null)
    returnresponse;
    }
    returnsuper.shouldInterceptRequest(view,url);
    }
    WebChromeClient
    onJsAlert:处理alert弹出框,有时候需要webChromeClient处理弹出
    onJsPrompt:处理prompt弹出框
    onJsConfirm:处理confirm弹出框onProgressChanged:获取当前网页的加载进度
    onReceivedIcon:获取网站的图标
    onReceivedTitle:获取当前网页的title
    onConsoleMessage:打印console信息
    使用场景
    onJsAlert:一般当需要显示alert的信息,把自带alert对话框变为无干扰的Toast提示。
    @Override
    publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,JsResultresult){
    Log.i("MainActivity","onJsAlertmessage="+message);
    Toast.makeText(getApplicationContext(),message,Toast.LENGTH_LONG).show();
    result.confirm();
    returntrue;
    }
    PS:这里容易出现的问题就是,如果你发现onJsAlert只会调用一次,那么你可能没有处理JsResult。需要调用result.confirm();或者result.cancel();,否则会出问题。-onProgressChanged:一般用作根据加载进度的变化来刷新进度条的进度。-onConsoleMessage:调试的时候如果想在console中看到打印信息,可以用这个函数。
    @OverridepublicbooleanonConsoleMessage(ConsoleMessagecm){
    Log.d("MyApplication",cm.message()+"--Fromline"+cm.lineNumber()+"of"+cm.sourceId());
    returntrue;
    }
    onReceivedTitle:获取当前网页的title,比如,分享一个网页的时候,如果你需要获取到它的title,可以在这里边获取。如果在onProgressChanged中用getTitle()来获取会获取不到,因为网页没加载完。
    与js相互调用
    调用js:
    mWebView.loadUrl("javascript:alert()");
    js调用java:
    window.js_callback.viewPicOnJavascript($('articleimg').index(this));
    ps:格式就是window.类名.函数名,当然要给java的函数标注上@JavascriptInterface的注解才能让js调用的。
    注释:4.2以后才有@JavascriptInterface,因为安全隐患问题。因为JavaScript可以通过反射访问注入webview的java对象的publicfields,使用宿主程序的权限执行java代码。所以,4.2以后,任何为JS暴露接口的,都要加上@JavascriptInterface。这样,这个Java对象的fields将不允许被js访问。
    js的回调函数见上边
    跳转到浏览器
    如果不想在webview中显示网页,而是直接跳转到浏览器的话,可以像下边那样调用。
    Uriuri=Uri.parse("http://www.example.com");
    Intentintent=newIntent(Intent.ACTION_VIEW,uri);
    startActivity(intent);
    关于webview播放视频,退出后仍有声音问题
    解决办法:
    protectedvoidonPause(){
    super.onPause();

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
    webView.onPause();//暂停网页中正在播放的视频
    }
    }
    收藏
  • 上一篇:Android Studio导入项目非常慢的解决办法

    下一篇:Android App 开发官方架构组件LifeCycle介绍

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56