热搜:微信 游戏 亮相 内存仅 抢不到 风林火山 电脑公司 王者荣耀 王者荣耀 万能装机 系统 xp 电脑公司 浏览器 一键重装 蜘蛛侠 快手 win7 fix realtek 微信 游戏 office mumu模拟器 微软电脑管家 22H2 secoclient 11 11 11 开始菜单 WingetUI 腾讯电脑管家 打印机 应用商店 谷歌浏览 批量下载 中国建设银行 win1032位 龙信 系统 Outlook AutoCAD 2023 Fix 迅雷 系统大师 装机大师 win7系统 WIFI sscom wps 采集 启动 植物大战僵尸 驱动人生 腾讯QQ V9.7.20 优酷 输入法 抖音 三只羊 短视频 qq 快手 系统 迅雷 注册表 学习通 红警 the vmware win11 必应 原神 小米 乙 和 UC浏览器网页版 TT SugarNMS 企业微信 21h2 Escrcpy 驱动精灵 京麦 QQ amd 搜狗 yy iOS16 kook 剪映 冰凌 CAD 华为电脑管家 edge 推流 雷电模拟器 pdf 键盘失灵 Microsoft photos 迅雷12 FileZilla Server LTSC CF 英语 企业版 中国移动云盘
WebView安卓版本它是Android操作系统中的一个组件,允许Android应用程序在应用程序的用户界面中显示网页内容。它是一个Web浏览器引擎,负责渲染网页,执行JavaScript代码,并处理与Web相关的其他功能。在Android 7.0(Nougat)在此之前,Webview作为一个单独的应用程序被捆绑在一起,并通过谷歌 更新Play商店。从Android。 从7.0开始,Webview通过常规系统更新成为一个系统组件。
许多Android应用程序,特别是那些包含网页内容或基于web功能的应用程序,依赖于webview来显示网页或与web服务互动。开发人员可以通过使用webview在其应用程序中无缝嵌入网页内容,从而创建更集成的用户体验。通过webview显示的web内容通常基于设备上默认的web浏览器使用的相同渲染引擎,如谷歌 Chrome或Android浏览器(在Chrome成为默认浏览器之前使用的浏览器)。这可以保证开发人员在不同的应用程序中提供一致的Web体验,并与Web标准和技术兼容。
webview是一个视觉组件,是原始应用程序的视觉部分。它可以嵌入移动终端,实现前端的混合开发。大多数混合开发框架都是基于webview模式进行二次开发的。例如:APIcloud、uni-app等框架。
一、webview入门知识
1、我们通常使用浏览器浏览网页。你清楚地知道你在使用浏览器,要么是个人电脑客户端,要么是手机上的应用程序。但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、完全承载应用程序中的所有交互。从技术角度来看,这些仍然是本地应用程序,但其唯一的本地操作是托管webview,称为混合应用程序。从部署和更新的角度来看,混合应用程序非常方便。
4、作为本地应用程序的扩展。由于web技术的简单性和强大性,许多本地应用程序将提供加载项或扩展程序来扩展其功能。这些加载项和扩展通常是HTML、CSS、而不是C 、C#或者其他建筑。
三、webview的精髓
webview实际上只是一个在再应用程序中设置位置和大小的浏览器,不会放置任何花哨的UI。
在大多数情况下,除非您调用本地API,否则无需在webview中专门测试web应用程序。
Android的WebView组件可以说是相当强大的,现在项目中常用的几个功能总结如下:
一、背景设置
WebView.setBackgroundColor(0);///首先将背景色设置为transparentt
WebView.setBackgroundResource(R.drawable.yourImage);//然后设置背景图片
二、获得Webview网页加载初始化和事件完成
步骤:
1、创建自己的Webviewclient(继承 WebViewClient Webviewclientent)
2、重载里面的 onPageFinished(WebView view, String url)方法,(webview加载完成后会调用此方法),这种方法会把自己想做的事情放在webview加载完成后。
3、关联你自己的webviewclient 与 webview 通过 这个方法:webView.setWebViewClient( new WebViewClient();
如果需要监控加载进度,则需要创建自己的webchromeclient类别,并重载onprogreschanged,然后
布局文件:
需要注意的是,webView的一系列用法,例如, webView.getSettings()。setJavaScriptEnabled(true);javscriptt可用于设置;
等等,具体参考API
在new生成一个setWebChromeClient之后,可以在内部类中写入进度条。 onProgreschanged事件
总结:在Webview的设计中,Webview并不是什么都要做,有些杂事是分给别人的,这样Webview就可以专注于自己的分析和渲染。
Webviewclient是为了帮助Webview处理各种通知和请求事件,包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
Webchromeclient是协助Webview处理Javascript的对话框、网站图标、网站标题、加载进度等
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功能的幕后领导者。上诉那些安卓 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()方法及其实现情况:
Webview返回getFactory Factory是通过调用webviewfactory类静态成员函数getprovider获得的。getprovider首先是判断静态成员变量sproviderinstance的值是否等于null。如果等于null,则表明目前的应用程序过程尚未加载chromium动态库。在这种情况下,需要加载chromium动态库和创建webviewew Factory,保存在静态成员变量sproviderinstance中。接下来,我们将首先分析chromium动态库的加载过程,然后分析webview Factory的创建过程。
通过调用webviewfactory类静态成员函数loadNativelipary,加载chromium动态库:
loadnativelipary将首先调用成员函数getwebviewnativeliparypaths获取要加载的chromium动态库的文件路径,然后调用另一个静态成员函数nativelowithrelrofile加载。加载时,将指定一个chromium GNURELRO Section文件。这个Chromium GNURELRO 当系统启动时,通过启动临时过程生成Section文件。其中,静态成员函数nativeloadWithrelrofile是由CNI方法制成的JNI方法 LoadWithrelrofile实现层的函数:
LoadWithrelrofile判断自己是32还是64,然后从参数lib32和lib64中选择相应的chromium动态库进行加载。
通过调用另一个函数DoloadWithrelroFile来实现这一加载过程:
函数DoloadWithrelofile的实现是通过Linker导出的函数androidlopenext在Zyogote过程保留的地址空间中加载Chromium动态库。请注意,Zygote过程fork提供了App过程,因此它还将获得Zygote过程预留的地址空间。然而,函数doloadWithrelofile将告诉函数androidlopenext,在加载chromium动态库时,参数relo描述的chromium GNURELRO Section文件的内存映射到内存中,并取代加载的chromium动态库的GNURELRO Section。这是通过指定ANDROIDLEXTUSERELRO标志来实现的。这样做的原因是参数relro描述的Chromiummium GNURELRO 与Section文件对应的Chromium动态库的加载地址与当前应用程序加载的Chromium动态库的地址一致。只要两个相同的动态库在两个不同的过程中具有相同的加载地址,其链接和重定位信息就完全相同,因此可以通过文件内存映射共享。共享后,可以达到节省内存的目的。
这一步完成后,App进程加载完成chromium动态库。回到前面分析的Webviewfactory静态成员函数getprovider,它将继续创建webviewfactory。这个webviewfactory可以用来创建webviewprovider。
Webviewfactory静态成员函数getprovider首先要确定要创建的webview Factory的类型。这种类型是通过调用另一个静态成员函数获得FactoryClass获得的:
从这里可以看出,Webviewfactory类静态成员函数getfactoryclass返回Webview com是Factory的类型.android.webview.chromium.WebViewChromiumFactoryProviderForO。这个com.android.webview.chromium.WebviewchromiumfactoryProviderforo类是前面提到的Webview Package提供的。这意味着Webviewfactory类静态成员函数getProvider创建的Webviewew Factory是WebviewchromiumFactoryProvider的对象:
Webviewchromiumfactoryprovider类的结构函数将调用awpowserproces类的静态成员函数loadlipary初始化前面加载的chromium动态库:
AwpowserProcess类静态成员函数loadLipary调用LiparyLoader类静态成员函数loadNow,初始化之前加载的Chromium动态库:
Liparyloader类静态成员函数loadnow调用另一个重载版本的静态成员函数loadnow初始化前面加载的chromium动态库:
Liparyloader类重载版的静态成员函数loadnow调用另一个静态成员函数loadalreadylocked初始化前面加载的chromium动态库:
并非所有系统在加载动态库时都支持GNURELRO,而不是文件内存映射。 Section,所以Chromium自己提供了一个Linker。通过这个Linker加载动态库时,GNURELRO可以用文件内存映射代替要加载的动态库 Section,也就是说,实现上述函数androidlopenext的功能。高于Android 在5.0中,由于系统已经提供了函数androidlopenext,chromium不会使用自己的linker来加载动态库,而是使用android系统提供的linker来加载动态库。使用系统提供的Linker,通过调用System类静态成员函数loadLipary来加载动态库。Liparyloader类静态成员函数loadaleadylocked要加载的动态库由Nativeliparies类静态成员变量liparies指定:
从这里可以看出,LiparyLoader类静态成员函数LoadalreadyLocked要加载的动态库是Chromium动态库。这个Chromium动态库已经加载在前面,所以当调用System类静态成员函数LoadLipary再次加载时,只会触发其导出的函数JNionLoad被调用而不会再加载。当Chromium动态库导出的JNionLoad被调用时,Chromium动态库将进行初始化:
最初的操作之一是为Chromium的Content层设置一种类型的AwmaindelegateMain Delegate。在Chromium的androidwebview模块中实现了Awmaindelegate。Android Webview是通过Chromiumandroidwebview模块加载和渲染网页的。Chromium在Content层中实现了加载和渲染网页的功能,因此,Chromium的androidwebview模块通过Content层实现了加载和渲染网页的功能。这样,Chromiumandroidwebview模块就可以设置Main Delegate给Content层,让它们能够相互交流。为Chromium的Content层设置Mainin 通过调用函数Setcontentmaindelegate实现Delegate:
从前面的分析可以看出,参数delegate指向Awmaindelegate对象,该Awmaindelegate对象将被函数setcontententmaindelegate保存在全球变量gcontententmain_delegate中。这一步完成后,Chromium动态库在app过程中加载,初始化工作已经完成。与此同时,该系统还为应用程序进程创建了一种WebviewfactoryProviderwebviewfactory。回到前面分析的webview类成员函数ensureprovidercreated,此时它将通过调用上述类型为webviewchromiumfactoryprovider的webviewfactory的webview为当前创建的webview创建一个webview Provider:
WebviewchromiumfactoryProvider类成员函数createwebview创建了一种webviewwwewwiew Provider。这个WebView Provider将返回Webview类成员函数ensureProvidercreated。Webview类成员函数ensureProvidercreated,然后将Webview类成员函数ensuredercreated。 Provider存储在成员变量mProvider中。通过这种方式,正在创建的WebView获得了一个WebView,类型为WebViewChromium Provider。将来通过这个Webview Provider,Chromium可以加载和渲染网页。/p>