分类分类
大小:68.5 M更新:2024/03/23
类别:常用工具系统:Android
Android System WebView是Android操作系统中的一个组件,它允许Android应用程序在应用程序的用户界面内显示网页内容。它充当了一个Web浏览器引擎,负责渲染网页、执行JavaScript代码和处理其他与Web相关的功能。在Android 7.0(Nougat)之前,WebView作为一个单独的应用程序捆绑在一起,并通过Google Play商店进行更新。从Android 7.0开始,WebView成为一个系统组件,通过常规系统更新进行更新。
许多Android应用程序,特别是那些包含网页内容或基于Web的功能的应用程序,依赖于WebView来显示网页或与Web服务进行交互。通过利用WebView,开发人员可以无缝地在其应用程序中嵌入网页内容,从而创建更加集成的用户体验。通过WebView显示的Web内容通常基于设备上默认的Web浏览器使用的相同渲染引擎,例如Google Chrome或Android浏览器(在Chrome成为默认浏览器之前使用的浏览器)。这样可以确保开发人员在不同的应用程序中提供一致的Web体验,并确保与Web标准和技术的兼容性。
webview是一个可视化的组件,是作为原生APP的视觉部分。可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于WebView模式进行二次开发的。比如:APIcloud、uni-app等等的框架。
一、webview入门知识
1、我们通常是用浏览器来浏览网页,你很清楚的知道你正在使用浏览器,要么是PC客户端,要么是手机上的app。但是webview是一个嵌入式的浏览器,是嵌入在原生应用中的,你可能都意识不到你在用浏览器。
2、传统浏览器分为两个部分,UI(地址栏、导航栏)和浏览器引擎。webview就是原生应用中的浏览器引擎。
3、webview只是一个可视化的组件,是作为原生APP的视觉部分。
4、用webview展示的内容是不需要存储在本地的,可以直接从服务器获取。
5、这种灵活性打开了浏览器端的web应用和希望展示在原生应用中的web应用代码直接可重用的世界。
6、运行在webview中的JS代码有能力调用原生的系统API,没有传统浏览器沙箱的限制。
7、沙箱的存在是因为,你永远不能完全信任加载的web内容,所以不能允许它调用原生的系统API。而在webview中开发人员通常可以完全控制加载的内容,恶意代码进入并在设备上造成混乱的可能性很低。
8、在webview中,JS代码可以跟原生应用代码相互通信,也可以调用原生API集成酷炫的系统级功能,如传感器、存储、日历、联系人等。
二、webview的用法
1、作为APP内置浏览器,显示链接的内容。
2、用来显示广告。
3、完全承载APP内的所有交互。从技术角度看这些仍是原生应用,但它做的唯一原生操作就是托管webview,这种应用被称为混合应用。从部署和更新的角度来看,混合应用非常方便。
4、作为原生应用的扩展。许多原生应用会提供加载项或扩展程序来扩展其功能,由于web技术的简单性和强大,这些加载项和扩展通常以HTML、CSS、JS而不是C++、C#或其他来构建。
三、webview的精髓
webview其实只是一个再应用中设置好位置和大小的浏览器,而且不会放置任何花哨的UI。
在大多数情况下,除非你调用了原生API,否则不必在webview中专门测试web应用。
android的WebView组件可以说是相当的强大,现将项目中经常用到的几个功能总结如下:
一、背景设置
WebView.setBackgroundColor(0);//先设置背景色为transparent
WebView.setBackgroundResource(R.drawable.yourImage);//然后设置背景图片
二、获得WebView网页加载初始化和完成事件
步骤:
1、创建一个自己的WebViewClient(继承 WebViewClient 类)如WebViewClient
2、重载里面的 onPageFinished(WebView view, String url)方法,(webview加载完成会调用这个方法),这个方法放自己想要做的事情,在webview加载完成以后
3、关联你自己的webviewclient 与 webview 通过 这个方法:webView.setWebViewClient( new WebViewClient();
如果需要监视加载进度的,需要创建一个自己的WebChromeClient类,并重载方法onProgressChanged,再
布局文件:
要注意的是,其中的webView的一系列用法,比如 webView.getSettings()。setJavaScriptEnabled(true);设置可以使用javscript;
等等,具体参考API
而进度条的使用是在new出一个setWebChromeClient后,可以在内部类中写 onProgressChanged事件
总结:在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。
WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持3322。
这里以Android 8.0的源码为来说明,是先找到WebView的真正的构造函数:
这个构造函数会调用另外一个成员函数ensureProviderCreated()确保Chromium动态库已经加载。在Chromium动态库已经加载的情况下,WebView类的成员函数ensureProviderCreated还会创建一个WebViewProvider对象,并且保存在成员变量mProvider中。这个WebViewProvider其实才是真正用来实现WebView的功能的幕后大佬。上诉那些Android WebView主要的方式基本都是通过mProvider来实现的,例如loadUrl(String url)等方法。
有了这个mProvider之后,WebView类的构造函数就会继续调用mProvider.init(javaScriptInterfaces, privatepowsing)启动网页渲染引擎。对于基于Chromium实现的WebView来说,它使用的WebViewProvider是一个WebViewChromium对象。当这个WebViewChromium对象的成员函数init被调用的时候,它就会启动Chromium的网页渲染引擎。
所以,我们接下来看一下ensureProviderCreated的实现:
WebView类的成员函数ensureProviderCreated首先调用成员函数checkThread确保它是在WebView的创建线程中调用的,接下来又会判断成员变量mProvider的值是否为null。如果为null,就表示它还没有当前创建的WebView创建过Provider。在这种情况下,它首先会调用成员函数getFactory获得一个WebViewFactory。有了这个WebViewFactory之后,就可以调用它的成员函数createWebView创建一个WebViewProvider。
接下来我们再看一下getFactory()方法以及它的实现:
getFactory返回的WebView Factory是通过调用WebViewFactory类的静态成员函数getProvider获得的,getProvider首先是判断静态成员变量sProviderInstance的值是否等于null。如果等于null,那么就说明当前的App进程还没有加载过Chromium动态库。在这种情况下,就需要加载Chromium动态库,并且创建一个WebView Factory,保存在静态成员变量sProviderInstance。接下来我们就先分析Chromium动态库的加载过程,然后再分析WebView Factory的创建过程。
加载Chromium动态库是通过调用WebViewFactory类的静态成员函数loadNativeLipary实现的:
loadNativeLipary首先会调用成员函数getWebViewNativeLiparyPaths获得要加载的Chromium动态库的文件路径,然后再调用另外一个静态成员函数nativeLoadWithRelroFile对它进行加载。在加载的时候,会指定一个Chromium GNURELRO Section文件。这个Chromium GNURELRO Section文件是系统启动时候,通过启动一个临时进程生成的。其中静态成员函数nativeLoadWithRelroFile是一个JNI方法,它由C++层的函数LoadWithRelroFile实现:
LoadWithRelroFile判断自己是32位还是64位的实现,然后从参数lib32和lib64中选择对应的Chromium动态库进行加载。
这个加载过程是通过调用另外一个函数DoLoadWithRelroFile实现的:
函数DoLoadWithRelroFile的实现是通过Linker导出的函数androiddlopenext在Zyogote进程保留的地址空间中加载Chromium动态库的。注意,App进程是Zygote进程fork出来的,因此它同样会获得Zygote进程预留的地址空间。不过,函数DoLoadWithRelroFile会将告诉函数androiddlopenext在加载Chromium动态库的时候,将参数relro描述的Chromium GNURELRO Section文件内存映射到内存来,并且代替掉已经加载的Chromium动态库的GNURELRO Section。这是通过将指定一个ANDROIDDLEXTUSERELRO标志实现的。之所以可以这样做,是因为参数relro描述的Chromium GNURELRO Section文件对应的Chromium动态库的加载地址与当前App进程加载的Chromium动态库的地址一致。只要两个相同的动态库在两个不同的进程中的加载地址一致,它们的链接和重定位信息就是完全一致的,因此就可以通过文件内存映射的方式进行共享。共享之后,就可以达到节省内存的目的了。
这一步执行完成之后,App进程就加载完成Chromium动态库了。回到前面分析的WebViewFactory类的静态成员函数getProvider,它接下来继续创建一个WebViewFactory。这个WebViewFactory以后就可以用来创建WebViewProvider。
WebViewFactory类的静态成员函数getProvider首先要确定要创建的WebView Factory的类型。这个类型是通过调用另外一个静态成员函数getFactoryClass获得的:
从这里可以看到,WebViewFactory类的静态成员函数getFactoryClass返回的WebView Factory的类型为com.android.webview.chromium.WebViewChromiumFactoryProviderForO。这个com.android.webview.chromium.WebViewChromiumFactoryProviderForO类是由前面提到的WebView Package提供的。这意味着WebViewFactory类的静态成员函数getProvider创建的WebView Factory是一个WebViewChromiumFactoryProvider对象:
WebViewChromiumFactoryProvider类的构造函数会调用AwpowserProcess类的静态成员函数loadLipary对前面加载的Chromium动态库进行初始化:
AwpowserProcess类的静态成员函数loadLipary又调用LiparyLoader类的静态成员函数loadNow对前面加载的Chromium动态库进行初始化:
LiparyLoader类的静态成员函数loadNow又调用另外一个重载版本的静态成员函数loadNow对前面加载的Chromium动态库进行初始化:
LiparyLoader类重载版本的静态成员函数loadNow又调用另外一个静态成员函数loadAlreadyLocked对前面加载的Chromium动态库进行初始化:
由于并不是所有的系统都支持在加载动态库时,以文件内存映射的方式代替它的GNURELRO Section,因此Chromium自己提供了一个Linker。通过这个Linker加载动态库时,能够以文件内存映射的方式代替要加载的动态库的GNURELRO Section,也就是实现前面提到的函数androiddlopenext的功能。在高于Android 5.0中,由于系统已经提供了函数androiddlopenext,因此,Chromium就不会使用自己的Linker加载动态库,而是使用Android系统提供的Linker来加载动态库。通过调用System类的静态成员函数loadLipary即可以使用系统提供的Linker来加载动态库。LiparyLoader类的静态成员函数loadAlreadyLocked要加载的动态库由NativeLiparies类的静态成员变量LIpARIES指定:
从这里可以知道,LiparyLoader类的静态成员函数loadAlreadyLocked要加载的动态库就是Chromium动态库。这个Chromium动态库前面已经加载过了,因此这里通过调用System类的静态成员函数loadLipary再加载时,仅仅是只会触发它导出的函数JNIOnLoad被调用,而不会重新被加载。Chromium动态库导出的JNIOnLoad被调用的时候,Chromium动态库就会执行初始化工作:
其中的一个初始化操作是给Chromium的Content层设置一个类型为AwMainDelegate的Main Delegate。这个AwMainDelegate实现在Chromium的androidwebview模块中。Android WebView是通过Chromium的androidwebview模块加载和渲染网页的。Chromium加载和渲染网页的功能又是实现在Content层的,因此,Chromium的androidwebview模块又要通过Content层实现加载和渲染网页功能。这样,Chromium的androidwebview模块就可以设置一个Main Delegate给Content层,以便它们可以互相通信。给Chromium的Content层设置一个Main Delegate是通过调用函数SetContentMainDelegate实现的:
从前面的分析可以知道,参数delegate指向的是一个AwMainDelegate对象,这个AwMainDelegate对象会被函数SetContentMainDelegate保存在全局变量gcontentmain_delegate中。这一步执行完成后,Chromium动态库就在App进程中加载完毕,并且也已经完成了初始化工作。与此同时,系统也为App进程创建了一个类型为WebViewChromiumFactoryProvider的WebViewFactory。回到前面分析的WebView类的成员函数ensureProviderCreated中,这时候就它会通过调用上述类型为WebViewChromiumFactoryProvider的WebViewFactory的成员函数createWebView为当前创建的WebView创建一个WebView Provider:
WebViewChromiumFactoryProvider类的成员函数createWebView创建的是一个类型为WebViewChromium的WebView Provider。这个WebView Provider将会返回给WebView类的成员函数ensureProviderCreated。WebView类的成员函数ensureProviderCreated再将该WebView Provider保存在成员变量mProvider中。这样,正在创建的WebView就获得了一个类型为WebViewChromium的WebView Provider。以后通过这个WebView Provider,就可以通过Chromium来加载和渲染网页了。
v122.0.6261.43版本
小错误修复和改进,安装或更新到最新版本即可查看!
小米运动健康安卓版常用工具133.93MBv3.29.1
详情车旺大卡老版本常用工具135.19MBv8.3.0
详情车旺大卡8.3.0版本常用工具135.19MB
详情jovi扫描app(jovi lens)常用工具56.7 Mv8.5.3.1
详情悬赏猫App官方正版常用工具25.18 Mv3.6.8
详情qdlink 安卓版(萌驾)常用工具5.1 Mv1.7.7车机版
详情米多赚钱官方版最新版常用工具25.94MBv1.8.0
详情csploit安卓版常用工具3.6 Mv1.6.6最新汉化版
详情vivo设置app(Settings)常用工具4.7 Mv2.5.1
详情mt管理器官方正版常用工具21.8 Mv2.14.4安卓手机最新版本
详情医站到家最新版常用工具22.52MBv2.4.8
详情Citymapper官方版常用工具39.63MBv11.18
详情ai画画板app常用工具84.5 Mv3.3.2
详情手机降温精灵app常用工具34.85MBv6.13.4
详情meetdvr官方版常用工具30.47MBv2.1.1
详情名贯四海起名测名软件正版常用工具9.21MBv1.2
详情万顺叫车司机端常用工具120.28MBv6.7.5
详情爱扫描免费版常用工具65.8MBv1.0.26.26.240314
详情短信助手最新版常用工具17.22MBv1.2.1
详情纪念币预约助手最新版常用工具18.8MBv2.12.416
详情三星指南针app(Compass)常用工具4.0 Mv1.0.00.148
详情红米赚钱APP常用工具25.29MBv1.6.0
详情兰铃货运司机版常用工具50.42MBv2.4.1
详情hfunpro软件官方常用工具201.0 Mv1.3.8
详情山西民生养老认证app常用工具114.22 Mv2.1.2
详情360天气3.22老版本常用工具7.02MBv3.22
详情津社保app常用工具39.2MBv2.0.17
详情辽宁人社App(辽宁智慧人社手机客户端)常用工具28.97 Mv1.4.4
详情甘肃人社生物识别认证系统app常用工具17.7MBv2.2
详情中国石化加油卡掌上营业厅app常用工具146.3MBv5.0.2
详情石家庄市民政智能服务官方版常用工具6MBv2.3
详情leica fotos 安卓中文版(徕卡相机互联软件)常用工具54.4 Mv4.2.2安卓手机版
详情小啄赚钱官方app常用工具34.1MBv4.2.3
详情小鸡语言翻译器中文版常用工具6.43MBv1.1
详情lexus雷克萨斯官方版常用工具87.64MBv2.0.8
详情清瞳监控安卓版常用工具103.65MBv2.1.7_2405291804
详情声音分贝软件常用工具60.0 Mv1.6
详情vivo原子笔记官方版常用工具38.9 Mv1.3.4.106
详情Jovi语音助手app常用工具56.86 Mv14.8.9.20
详情衡水招聘网最新版常用工具44.56MBv2.6.14
详情点击查看更多
纪念币预约助手最新版常用工具18.8MBv2.12.416
详情爱扫描免费版常用工具65.8MBv1.0.26.26.240314
详情辽宁人社App(辽宁智慧人社手机客户端)常用工具28.97 Mv1.4.4
详情腾讯元宝app常用工具63.65 Mv1.1.5
详情韵达超市安卓版常用工具147.56MBv4.6.4
详情交管12123鸿蒙版常用工具103.76 Mv3.0.6
详情7zip解压缩软件常用工具47.6 Mv5.7.0
详情瓦罗兰特准星助手app常用工具28.5 Mv5.4.0
详情陕西高龄补贴认证app官方手机版常用工具69.46MBv3.0.25
详情百度输入法app常用工具106.84 Mv12.2.0.65
详情米多赚钱官方版最新版常用工具25.94MBv1.8.0
详情豆包ai官方版常用工具76.53 Mv2.8.0
详情shizukurunner命令大全常用工具83KBv17
详情悬赏猫App官方正版常用工具25.18 Mv3.6.8
详情迅雷极速版手机客户端常用工具119.7 Mv8.11.0.9225官方
详情手机电池修复大师app常用工具26.7 Mv1.2.8
详情日历清单手机版官方版常用工具26.16 Mv2.0.11
详情appshare最新版本常用工具25.5 Mv3.1.2
详情2345天气王最新版常用工具51.0 Mv10.8.3
详情易企秀设计最新版本常用工具48.4 Mv5.33.0安卓手机版
详情贝壳找房app常用工具123.67 Mv3.00.80
详情画中世界拼图最新版常用工具43.4 Mv1.1
详情168plus行车记录仪app常用工具10.1 Mv2.3.4
详情解压专家手机app常用工具36.1 Mv1
详情clearai官方版常用工具34.0 MBv4.0.0
详情兜风记录仪app常用工具24.1 Mv110.211016
详情片语app常用工具13.7 Mv2.0.0
详情vivo设置app(Settings)常用工具4.7 Mv2.5.1
详情甘肃新天水app常用工具106.03MBv6.1.2
详情AppShare最新版常用工具26.25 Mv3.1.6
详情qdlink 安卓版(萌驾)常用工具5.1 Mv1.7.7车机版
详情卡片记账喵app手机版常用工具43.9 Mv1.0.0
详情小米运动健康安卓版常用工具133.93MBv3.29.1
详情secondscreen官方最新版常用工具1.7 Mv2.9.3安卓16:9版
详情jovi扫描app(jovi lens)常用工具56.7 Mv8.5.3.1
详情河北省人社公共服务平台官方版常用工具50.43MBv9.2.30
详情周公解梦大全查询梦2345原版常用工具7.71MBv3.2.1
详情音量放大器安卓版常用工具2.89MBv3.0.0
详情丹东惠民卡养老认证app常用工具82.02MBv1.3.8
详情中国石化加油卡掌上营业厅app常用工具146.3MBv5.0.2
详情点击查看更多
千络文旅app常用工具45.91MBv1.18.0
详情猫语狗语转换器APP常用工具34.54MBv1.9.4
详情上海中原地产app常用工具86.79MBv4.14.1
详情西安公交出行app常用工具47.41MBv2.0.9.2
详情西安出行app常用工具47.41MBv2.0.9.2
详情爱康伴你app常用工具65.2MBv1.0.4
详情北瓜电话安卓版常用工具43.74MBv3.0.1.6
详情奈斯天气精简版常用工具34.94MBv1.3.0
详情哆点app常用工具21.38MBv2.7.0
详情上海挂号预约常用工具25.8MBv2.4.2
详情懒人轻断食最新版常用工具42.69MBv1.4.6
详情网名生成器app常用工具30.61MBv1.5.1
详情筑人才app常用工具44.96MBvGyzrcGr_And_4.0.0.231127_R
详情桌面便签助手软件手机版常用工具92.8 Mv1.0.0
详情耳机助听器app常用工具8.2 Mv1.1
详情录够录屏app常用工具20.2 Mv1.1.7
详情ai跳绳计数器手机版常用工具36 Mv1.0.1
详情手机互换克隆大师客户端常用工具32.1 Mv1.4
详情成倍放大镜APP常用工具32.4 Mv1.0.8
详情睿易官方版常用工具69.4 Mv6.2.2
详情fusionmobile手机版常用工具45.7 Mv1.0.0
详情环保设备运维智能管家软件常用工具31.3 Mv1.0.2
详情测距客户端常用工具21.7 Mv4.5.6
详情纪恋日倒数app常用工具97.5 Mv1.0.0
详情密码锁屏客户端常用工具19.5 Mv4.5.6
详情酷乐手电筒app常用工具72.5 Mv4.3.46
详情手机畅联投屏app常用工具86.6 Mv1.1
详情ibasso uac app最新版本常用工具7.1 Mv1.3.2
详情pr视频软件常用工具57.0 Mv1.0
详情多功能打印机手机版常用工具49.7 Mv1.1
详情好停车云座席app常用工具50.7 Mv1.0.0
详情美车配app常用工具35.2 Mv2.0.2
详情ai梦境绘画app常用工具35.4 Mv1.0.0
详情自习吧官方版常用工具50.5 Mv1.0.0
详情tepra lite app常用工具195 Mv2.3.1(252)
详情一盎司清单最新版常用工具30.9 Mv1.1.18
详情大数据速记app常用工具24.7 Mv1.3.2
详情风驰出行司机端优选版app常用工具63.1 Mv1.10.3
详情应用隐私保护锁app常用工具4.6 Mv1.0.0
详情抽屉多多app常用工具49.0 Mv1.0.6
详情点击查看更多