随着app的迭代,嵌入的html5界面越来越多了,Webview这个强大组件引起的问题越发的多起来,例如:
为了解决以上问题,我们把WebView模块做成独立进程
WebView独立进程
Android允许一个app同时存在多个进程,可以根据需要把不同的模块放到不同进程中处理。
比如微信v2.X+版本的时候把Network部分做轻重进程分离,独立到一个单独的进程(:push)中,而上面两个层级依然跑在微信的主进程(:workder)中。而对于有内存泄露问题的webview或者其他不频繁使用的功能,再把其分离到独立的工具进程(:tools)中。通过分离进程,微信第一次重构解决了系统因为微信资源消耗,主动干掉微信服务的困境。
WebView独立进程的好处
有效增大App的运存,减少由webview引起的内存泄露对主进程内存的占用。
避免WebView的Crash影响App主进程的运行。
拥有对WebView独立进程操控权。
WebView进程与其他进程通讯的方式
把webview独立进程之后会发现,埋点功能和接收主进程数据都不正常了,这里就涉及到进程间通讯的问题了;
进程通讯无非就是那几种,aidl,messager,content provider,广播;
在这里就不再复述了,我是采用广播的方式来做的。
WebView硬件加速导致页面渲染闪烁
4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启,代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
webview的配置
下面贴上我自己的配置代码:
WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true);//启用js settings.setJavaScriptCanOpenWindowsAutomatically(true);//js和android交互 String cacheDirPath = PathCommonDefines.WEBVIEW_CACHE; settings.setAppCachePath(cacheDirPath); //设置缓存的指定路径 settings.setAllowFileAccess(true); // 允许访问文件 settings.setAppCacheEnabled(true); //设置H5的缓存打开,默认关闭 settings.setUseWideViewPort(true);//设置webview自适应屏幕大小 settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);//设置,可能的话使所有列的宽度不超过屏幕宽度 settings.setLoadWithOverviewMode(true);//设置webview自适应屏幕大小 settings.setDomStorageEnabled(true);//设置可以使用localStorage settings.setSupportZoom(false);//关闭zoom按钮 settings.setBuiltInZoomControls(false);//关闭zoom if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } @Override public void onLoadResource(WebView view, String url) { } @Override public void onPageFinished(WebView view, String url) { } });
html5跳原生界面
网页跳原生界面的方法有很多种,比如js调java方法,或者是通过uri scheme啦,也可以通过自己解析url来做。
在这儿,考虑到兼容性,拦截的是url,并且在清单文件中自定义了scheme~
webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { parserURL(url); //解析url,如果存在有跳转原生界面的url规则,则跳转原生。 return super.shouldOverrideUrlLoading(view, url); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } @Override public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); } });
清单文件中,声明一下 就可以在自带浏览器通过uri scheme跳到本app页面了,这个activity作为各个页面的分发页面,通过这个界面解析数据决定接下来要跳转哪个页面:
<activity android:name=".ui.webview.CommWebviewActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:process=":webview" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden"> <intent-filter> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW" /> <data android:host="xxxx.com" android:scheme="kingp2p" /> </intent-filter> </activity>
本文向大家介绍Mysql优化之Zabbix分区优化,包括了Mysql优化之Zabbix分区优化的使用技巧和注意事项,需要的朋友参考一下 使用zabbix最大的瓶颈在于数据库,维护好zabbix的数据存储,告警,就能很好地应用zabbix去构建监控系统。目前zabbix的数据主要存储在history和trends的2个表中,随着时间的推移,这两个表变得非常大,性能会非常差,影响监控的使用。对MySQ
本文向大家介绍mysql性能优化之索引优化,包括了mysql性能优化之索引优化的使用技巧和注意事项,需要的朋友参考一下 作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多
移动应用程序新手。我正在尝试在我的android应用程序上使用webview。但我的代码中有一个问题。我使用了https://developer.android.com/但它现在不知怎么起作用了。你能查一下我的密码吗。。。。 Android说“无法解决符号webview”... 整个代码都在这里-
本文向大家介绍Android 优化之卡顿优化的实现,包括了Android 优化之卡顿优化的实现的使用技巧和注意事项,需要的朋友参考一下 Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次。 这就意味
本文向大家介绍Android 优化之app启动优化的实现,包括了Android 优化之app启动优化的实现的使用技巧和注意事项,需要的朋友参考一下 App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个空白的
本文向大家介绍总结Android App内存优化之图片优化,包括了总结Android App内存优化之图片优化的使用技巧和注意事项,需要的朋友参考一下 前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮、背景、动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片