webview之简介

webview与js交互:

Tencent/VasSonic(缓存优化方案)
lzyzsd/JsBridge
pengwei1024/JsBridge
-----webview的框架
TheFinestArtist/FinestWebView-Android
delight-im/Android-AdvancedWebView
KeejOow/android-post-webview
-----学习文章
Android WebView重定向问题的解决方案
Android进阶---Android Webview重定向问题解决
Android WebView内处理302重定向
Android webview处理404、500、断网、timeout页面的问题(by 星空武哥)
android WebKit
Android WebView的Js对象注入漏洞解决方案
Android中WebView的使用指南:
Android:手把手教你构建 全面的WebView 缓存机制 & 资源加载方案
JsBridge 实现 JavaScript 和 Java 的互相调用
WebView使用详解(二)——WebViewClient与常用事件监听
WebView使用详解(三)——WebChromeClient与LoadData补充
Anaroid WebView API详解--http://blog.csdn.net/zhangcanyan/article/details/51344090;
Android5.1系统WebView内存泄漏场景--http://blog.csdn.net/zhangcanyan/article/details/51344118;
Android WebView的缓存方式分析--http://blog.csdn.net/zhangcanyan/article/details/51347744;
Android安全开发之WebView中的大坑--http://blog.csdn.net/zhangcanyan/article/details/51930775;
 
2. webview ---- 运行时不调用系统自带浏览器
1. 安卓webview post传值问题
11. WebView基本功能(html5、文件下载和远程URL10.webview--网

一. webview常见的问题
1.安卓webview post传值问题:
比如要传过去的键值对分别为 user_name = abc, password = 123456;
String postdata = "user_name=abc&password =123456";
mWebView.postUrl(url,EncodingUtils.getBytes(postData, "BASE64"));
如果把键值对存在map里面,那么正则表达式,转化成一个字符串,
String postData = map.toString().replaceAll("[{}]", "").replace(",", "&");
mWebView.postUrl(url,EncodingUtils.getBytes(postData, "BASE64"));这样就可以把这个值post过去了。
方法3:1)把你要传的参数添加到集合中
TreeMap<String, String> params = geturl(countApi);
// UtilsTools.Log_e(TAG, "要传的map里的数据" + params.toString());
2)遍历集合把集合的数据就 key=value+& 的形式拼成字符串
Set<String> keySet = params.keySet();
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
String key = iter.next();
key_sort_url = key_sort_url + key + "=" + params.get(key) + "&"; substring_url = key_sort_url.substring(0, key_sort_url.length() - 1);
}
3)Post请求
webView.postUrl(传要访问的地址, EncodingUtils.getBytes(参数拼接字符串, "BASE64"));
12,WebView基本功能(html5、文件下载和远程URL)
在Android中有WebView ,它内置WebKit引擎,同时,WebKit也是Mac OS X的Safari网页浏览器的基础。
WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它的。所以很多表现WebView和Chrome是一样的。
在使用WebView之前,要在AndroidManifest.xml中添加 如下权限:,否则会出Web page not available错误。
1 . 加载网页:
网络用:webView.loadUrl("http://www.baidu.com");
本地文件用:webView.loadUrl(file:///android_asset/XXX.html);格式是固定的,文件位置 assets目录下
2. 使用loadData方法来加载html数据
loadData()需要三个参数: HTML TAG ,MIME类型(text/html), 网页编码方式(utf-8).
使用它时可能会发现有如下问题:
I. loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL。
II .使用loadData方法显示乱码。那是因为编码器设置错误导致的。String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码,
所以我们在loadData的时候要告诉方法怎样转码。即要告诉它要将unicode编码的内容转成UTF-8编码的内容。有些朋友虽然在loadData的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebView的text编码指定编码方式.
String content = getUnicodeContent() ;
wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;
wv.loadData(content, “text/html”, “UTF-8”) ;
WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。
通过设置webview.getSettings().setJavaScriptEnabled(true);
3. setScrollBarStyle 设置滚动条风格
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);在内容显示内部显示
4. ClearCache 清除缓存内容
5. goBcak canGoBack goForward canGoForward
6. webView.stopLoading()停止加载页面
7. 播放和停止播放:1.如何播放:
近来工作要用Android的webview播放HTML5 video标签。做了下试验,用Android自带的Browser可以装载含有video标签的HTML5页面,
而且能正常播放,但同样的网页用webview来加载就没法播放HTML5中的video在网上查了许多资料,经过无数次测试,终于成功了,做法如下第一步当然是要先有个Webivew对象,是写在main.xml也好,或者动态创建也罢,
总之有了一个Webview对象即可,假设其名为m_webview,然后设置一些属性:m_webview.getSettings().setJavaScriptEnabled(true);m_webview.setWebChromeClient(m_chromeClient);
本来以为要设置m_webview.getSettings().setPluginsEnabled(true);但后来发现去掉后也不影响效果。
private WebChromeClient m_chromeClient = new WebChromeClient(){
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {}
};
onShowCustomView函数中什么也不用写,有篇文章http://blog.csdn.net/wolfman79/article/details/7868975还在那个函数里进行了实现,调用了video.start()之类的东西,但我测试了一下,发现那个函数根本就没有被调用,所以那个函数里的实现就都去掉了。
2.如何在activity结束时停止播放:
能够播放视频了,但发现当activity结束时,视频在后边还在播放,实在令人烦恼,
又查了一通资料,终于找到解决方法,非常简单,就是在activity的onPause函数中调用webview的onPause函数即可。
以上是Android 4.0.3中实现的
8. webiew的下载功能:
在做美图欣赏Android应用的时候,其中有涉及到Android应用下载的功能,就是通过WebView控制调用相应的WEB页面进行展示。刚开始以为和普通的文件下载实现,只需要一个链接,然后点击就可以实现下载了,可是放到手机上试的时候,点击下载链接一点反应都没有,在普通页面里面点击是好的,且点击其它的普通链接是可以正常工作的。
原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:
1、设置WebView的DownloadListener:
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、实现MyWebViewDownLoadListener这个类
private class MyWebViewDownLoadListener implements DownloadListener {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent); }
}
这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载,不过,这也基本上满足我们的应用场景了。

11.webview--网络超时

public class TestJsActivity extends Activity {

private long timeout = 5000;
private WebView mWebView;
private Handler mHandler = new Handler();
private Timer timer;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
mWebView.setWebViewClient(new WebViewClient() {
/*
* onPageStarted中启动一个计时器,到达设置时间后利用handle发送消息给activity执行超时后的动作.
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("testTimeout", "onPageStarted...........");
super.onPageStarted(view, url, favicon);
timer = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
/*
* 超时后,首先判断页面加载进度,超时并且进度小于100,就执行超时后的动作
*/
if (TestJsActivity.this.mWebView.getProgress() < 100) {
Log.d("testTimeout", "timeout...........");
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
timer.cancel();
timer.purge();}
}
};
timer.schedule(tt, timeout, 1);
}
/**
* onPageFinished指页面加载完成,完成后取消计时器
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("testTimeout", "onPageFinished+++++++++++");
Log.d("testTimeout", "+++++++++++" + TestJsActivity.this.mWebView.getProgress());
timer.cancel();
timer.purge();
}
});
mWebView.loadUrl("http://image.baidu.com/i?ct=201326592&cl=2&nc=1&lm=-1&st=-1&tn=baiduimage&istype=2&fm=index&pv=&z=0&word=%D7%C0%C3%E6&s=0");
}

其中要注意的是onPageFinished的两点,第一点,官方是这样解释的:
也就是说,程序只认为DOM加载完成就完成了,正在加载的图片不在这个范围之内。
第二点是,如果在JS文件中又动态去加载另一JS,onPageFinished方法会在所有的JS全部加载完毕后才调用。
--4,Android中java与 javaScript交互;
--3,Android Webview清除缓存和Cookie;
--2,WebView自适应屏幕宽度代码;
--1,Android WebView编程的那些坑(一);
3. Android中java与 javaScript交互;
如何实现
实现Java和js交互十分便捷。通常只需要以下几步。
WebView开启JavaScript脚本执行
WebView设置供JavaScript调用的交互接口。
客户端和网页端编写调用对方的代码。

public class MainActivity extends Activity {
  private static final String LOGTAG = "MainActivity";
  @SuppressLint("JavascriptInterface")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final WebView myWebView = (WebView) findViewById(R.id.myWebView);
      WebSettings settings = myWebView.getSettings();
      settings.setJavaScriptEnabled(true);
      myWebView.addJavascriptInterface(new JsInteration(), "control");
      myWebView.setWebChromeClient(new WebChromeClient() {});
      myWebView.setWebViewClient(new WebViewClient() {
          @Override
          public void onPageFinished(WebView view, String url) {
              super.onPageFinished(view, url);
              testMethod(myWebView);
          }
      });
      myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
  }
  private void testMethod(WebView webView) {
      String call = "javascript:sayHello()";
      call = "javascript:alertMessage(\"" + "content" + "\")";
      call = "javascript:toastMessage(\"" + "content" + "\")";
      call = "javascript:sumToJava(1,2)";
      webView.loadUrl(call);
  }

  public class JsInteration {
      @JavascriptInterface
      public void toastMessage(String message) {
          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
      }
      @JavascriptInterface
      public void onSumResult(int result) {
          Log.i(LOGTAG, "onSumResult result=" + result);
      }
  }
}

前端网页代码;

<script type="text/javascript">
    function sayHello() {
        alert("Hello")
    }
    function alertMessage(message) {
        alert(message)
    }
    function toastMessage(message) {
        window.control.toastMessage(message)
    }
    function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
    }
</script>
Java-Javascript Interaction In Android

1.js调用Java
调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。
function toastMessage(message) {
window.control.toastMessage(message)
}
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
2.Java调用JS
webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)
调用js无参无返回值函数:
String call = "javascript:sayHello()";
webView.loadUrl(call);
调用js有参无返回值函数:
注意对于字符串作为参数值需要进行转义双引号。
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
调用js有参数有返回值的函数:
1) Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用思路是java调用js方法,js方法执行完毕,再次调用java代码将值返回。
1.Java调用js代码
String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
2.js函数处理,并将结果通过调用java方法返回
function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}
@JavascriptInterface
public void onSumResult(int result) {
Log.i(LOGTAG, "onSumResult result=" + result);
}
2) 4.4处理:
Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法
function getGreetings() {
return 1;
}
java代码时用evaluateJavascript方法调用
private void testEvaluateJavascript(WebView webView) {
webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.i(LOGTAG, "onReceiveValue value=" + value);
}});
}
输出结果
I/MainActivity( 1432): onReceiveValue value=1
注意
上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
疑问解答?
Alert无法弹出?
你应该是没有设置WebChromeClient,按照以下代码设置;
myWebView.setWebChromeClient(new WebChromeClient() {});
Uncaught ReferenceError: functionName is not defined
问题出现原因,网页的js代码没有加载完成,就调用了js方法。解决方法是在网页加载完成之后调用js方法
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//在这里执行你想调用的js函数
}
});
Uncaught TypeError: Object [object Object] has no method
安全限制问题?
如果只在4.2版本以上的机器出问题,那么就是系统处于安全限制的问题了。Android文档这样说的
警告:如果你的程序目标平台是17或者是更高,你必须要在暴露给网页可调用的方法(这个方法必须是公开的)加上@JavascriptInterface注释。如果你不这样做的话,在4.2以以后的平台上,网页无法访问到你的方法。
两种解决方法
将targetSdkVersion设置成17或更高,引入@JavascriptInterface注释
自己创建一个注释接口名字为@JavascriptInterface,然后将其引入。注意这个接口不能混淆。
注,创建@JavascriptInterface代码
public @interface JavascriptInterface {}
代码混淆问题
如果在没有混淆的版本运行正常,在混淆后的版本的代码运行错误,并提示Uncaught TypeError: Object [object Object] has no method,那就是你没有做混淆例外处理。 在混淆文件加入类似这样的代码
-keep class com.example.javajsinteractiondemo$JsInteration {
*;
}
All WebView methods must be called on the same thread?
过滤日志曾发现过这个问题。
E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1)
{528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {528712d4})
E/StrictMode( 1546): at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546): at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546): at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546): at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546): at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546): at android.os.HandlerThread.run(HandlerThread.java:61)
在js调用后的Java回调线程并不是主线程。如打印日志可验证
ThreadInfo=Thread[WebViewCoreThread,5,main]
解决上述的异常,将webview操作放在主线程中即可。
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl(YOUR_URL).
}
});

2,Android Webview清除缓存和Cookie;
最近项目中遇到用webView显示内容的需求,接到任务后代码如下
// 更新加载进度条
wv_setmeal_detail.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
pb_webview.setProgress(progress);
f (progress == 100) {
pb_webview.setVisibility(View.GONE);
}
}
});
wv_setmeal_detail.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
}
});
wv_setmeal_detail.loadUrl(url);
嗯,没问题,显示的很好,但是测试时发现一个坑爹的问题,
就是退出当前账号换其他账号登录时webview显示的内容还是之前账号的信息,额...怪了.想想肯定是缓存搞的鬼,好,接下来就是清除缓存.
网上各种google baidu,发现很多方法都不管用.做法一般如下
1.websettings设置不适用缓存
mCurrentWebView.clearCache(true);
mCurrentWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
其实不管用...
2.webview显示时会自动生成如下文件 : data/data/<包名>/app_webview , 然后就是循环遍历删除该文件下的内容
// 清除WebView缓存
public void clearWebViewCache() {
// WebView 缓存文件
File appCacheDir = new File(DATA_BASE_PATH + getPackageName() + APP_WEBVIEW_PATH);
if (appCacheDir.exists()) {
deleteFile(appCacheDir);
}
}
/**
* 递归删除 文件/文件夹
*/
public void deleteFile(File file) {
if (file.exists()) {
if (file.isFile()) {
file.delete();
} else if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFile(files[i]);
}
}
file.delete();
}
}
发现推出后马上切换行,过一分钟左右还是不行. 就郁闷了...到底缓存数据存在哪了呢...
最后google在stackoverflow上看到一篇文章,问题得以解决.原来是要清除webview的cookie才能彻底把缓存清除
public void clearWebViewCache() {
// 清除cookie即可彻底清除缓存
CookieSyncManager.createInstance(self);
CookieManager.getInstance().removeAllCookie();
}
附上两篇文章地址
http://stackoverflow.com/questions/2465432/android-webview-completely-clear-the-cache
http://www.devdiv.com/forum.php?mod=viewthread&tid=116641
吐槽一下 百度真的搜出来是一大堆没用的东东,google是王道啊,stackoverflow这个网站真心不错,好多问题都在上边得以解决.

1,WebView自适应屏幕宽度代码;
// 让网页自适应屏幕宽度
WebSettings webSettings= webView.getSettings();
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型: NORMAL:正常显示,没有渲染变化。 SINGLE_COLUMN:把所有内容放到WebView组件等宽的
一列中。 NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。
Android中WebView图片实现自适应的方法:
加上这个属性后,html的图片就会以单列显示,就不会变形占了别的位置
WebSettings ws = tv.getSettings();
ws.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
webView.setInitialScale(5);//让缩放显示的最小值为起始
webSettings.setSupportZoom(true);// 设置支持缩放
webSettings.setBuiltInZoomControls(true);// 设置缩放工具的显示
一. Android WebView编程的那些坑(一)
最大的坑是ROM不同,webkit不同,差异性很大。再加上google的坑,真是坑上加坑。
比如js注入问题,比如client回调接口时序问题,比如内存回收问题,etc
1、内存泄漏问题,尤其注意Android 5.0系统的WebView移除不了的问题;
2、WebKit线程数不能控制,低效,例如,如果js效率出现问题或者大量js执行,直接就导致连HTTP请求都延迟,
自己抓包就知道(你会傻乎乎地去指责服务器同事怎么你们服务器这么烂,网页加载好慢);
3、webcorethread的wait问题,不知道什么时候就会发生,完全束手无策。后果是什么?退出页面没有卵用,只能杀进程。
4、Android4.2以下手机的JavaScript interface的注入漏洞问题,完全不要太危险;
5、弱鸡的一系列ui问题,滚动,滑动,兼容,把网页前端哥们苦不堪言,找Android前端同事投诉,Android同学很无奈,
完全不知道该怎么办。
解决方案:1.跨进程。(无法解决兼容问题)2.放弃它。
一级bug如下:
应用需求,一个页面里面有多个fragment,然后fragment里面都是webview加载内容的,然后你会发现不知道
什么时候(对,就是不知道什么时候),webview加载不出内容了,白屏一片。OK,没问题,加载不出来无所谓啦,大不了重进,
跟下去,发现底层有一条叫webcore(印象中是这个名字)的线程一直处于wait的状态,再也恢复不了了,唯一拯
救就是杀进程。
在某些手机上,Webview承载视频时,activity销毁后,视频资源没有被销毁。
解决办法:在onDestory之前修改url为空地址。
WebView居然提供了一个超奇葩的Destroy方法,需要自己手动去调一下才能释放资源。否则就算依赖的Activit 或者Fragment不在了,资源还是不会被释放干净。
1、 onPageFinished这个也是把我坑好久,进度条该结束的时候不结束,不该结束的时候提前结束,
我总结根本原因还是不同版本浏览器内核的实现差异导致的,也深入过内核代码发现确实结束的回调时机有差异,
除非自己做内核,否则除了尽可能的兼容处理外,尽量保证它提前结束,因为迟迟不结束比提前结束体验要糟糕得多。
2、webView耗电的问题,我们之前发现的一个情况是,webView切换到后台时,如果当前页面有JS代码仍在不时的run,
就会导致比较严重的耗电,所以必须确保切换到后台后暂停JS执行,同时切回来的时候恢复它。
3. webView闪屏的问题,也是确实存在的,试验过,确实跟硬件渲染有关。
4. 数据积累也是头疼的问题,经常有用户抱怨它的空间被占满了,其实是webkit本身没有管理好缓存,不得不让浏览器开发人员涉法处理。
5.默认的webview滚动条确实很粗,但还是可以修改的。
想起来的的后面再补充:
webview原生支持js与native代码交互,
可惜在4.2以下版本上有安全漏洞,各大浏览器厂商都紧急应对,我们也还是想了其他办法,
解决了这个问题。
其实所谓的WebView的各种坑,大部分是Webkit等内核的坑,其实只是它正常发展成熟过程中的一些遗留问题,
遗憾的是Android版本的严重碎片化,使得这些问题我们不得不面对。
作为Ninja浏览器(mthli/Ninja · GitHub)的开发者,我想我遇到的问题应该具有一些代表性吧。
下面说说我比较困惑的几个地方:
11,WebViewClient.onPageFinished()。
你永远无法确定当WebView调用这个方法的时候,网页内容是否真的加载完毕了。
当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释
(How to listen for a Webview finishing loading a URL in Android?), 但其中列举的解决方法并不完美。
所以当WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()
比WebViewClient.onPageFinished()都要靠谱一些。
12,WebView后台耗电问题:
当你的程序调用了WebView加载网页,WebView会自己开启一些线程(?),如果你没有正确地将WebView销毁的话,
这些残余的线程(?)会一直在后台运行,由此导致你的应用程序耗电量居高不下。
对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。
13,切换WebView闪屏问题。
如果你需要在同一个ViewGroup中来回切换不同的WebView(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。
这应该是Android硬件加速的Bug,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。
14,数据积累问题。
开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、Cookie、Form Data、History、Password等等东西,
你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了 :
15,滚动条问题。
Android System WebView的横向滚动条真是好粗的有木有...
另外针对Android System WebView的相关开发,推荐看看Google官方的示例教程 GoogleChrome/chromium-webview-samples ·GitHub

posted on 2018-08-14 23:26  左手指月  阅读(303)  评论(0编辑  收藏  举报