WebView安卓版
點(diǎn)此糾錯(cuò)
- 版本:v132.0.6834.79
- 大?。?/em>226.83M
- 語言:簡(jiǎn)體中文
- 類別:系統(tǒng)工具
- 授權(quán):免費(fèi)
- 更新:2025-01-20
- 權(quán)限:查看
- 隱私:查看
- 廠商:Google Inc.
- MD5:DC745ED123F798B6C676C9C29CBB4E2F
- 包名:com.google.android.webview
- 標(biāo)簽:系統(tǒng)自帶應(yīng)用谷歌軟件
- 需要網(wǎng)絡(luò) 無廣告
類似應(yīng)用
-
SecoClient(華為防火墻) 其它軟件 / 3.32M
-
uc瀏覽器谷歌版play中文版 網(wǎng)絡(luò)瀏覽 / 70.77M
-
faceu激萌美顏相機(jī)官方正版 拍攝美化 / 97.2M
-
uc瀏覽器手機(jī)版 網(wǎng)絡(luò)瀏覽 / 109.01M
精彩發(fā)現(xiàn)
換一換精品推薦
-
magisk官方中文版 系統(tǒng)工具 / 11.17M
查看 -
WiFi萬能鑰匙官方正版 系統(tǒng)工具 / 98.1M
查看 -
七麥數(shù)據(jù)APP 系統(tǒng)工具 / 5.43M
查看 -
Scene5工具箱最新版 系統(tǒng)工具 / 8.26M
查看 -
百度輸入法app 系統(tǒng)工具 / 116.85M
查看
專題推薦
本類排行
- 1 查看
- 2 查看
- 3 查看
- 4 Shizuku軟件安卓版
- 5 豌豆代理App
- 6 豌豆IP官方最新版
- 7 甲殼蟲ADB助手App
- 8 花瓣測(cè)速App
- 9 Fake Location官方版
- 10 EasyTouch官方最新版
詳情介紹
WebView安卓版是Android操作系統(tǒng)中的一個(gè)組件,它允許Android應(yīng)用程序在應(yīng)用程序的用戶界面內(nèi)顯示網(wǎng)頁內(nèi)容。它充當(dāng)了一個(gè)Web瀏覽器引擎,負(fù)責(zé)渲染網(wǎng)頁、執(zhí)行JavaScript代碼和處理其他與Web相關(guān)的功能。在Android 7.0(Nougat)之前,WebView作為一個(gè)單獨(dú)的應(yīng)用程序捆綁在一起,并通過Google Play商店進(jìn)行更新。從Android 7.0開始,WebView成為一個(gè)系統(tǒng)組件,通過常規(guī)系統(tǒng)更新進(jìn)行更新。
許多Android應(yīng)用程序,特別是那些包含網(wǎng)頁內(nèi)容或基于Web的功能的應(yīng)用程序,依賴于WebView來顯示網(wǎng)頁或與Web服務(wù)進(jìn)行交互。通過利用WebView,開發(fā)人員可以無縫地在其應(yīng)用程序中嵌入網(wǎng)頁內(nèi)容,從而創(chuàng)建更加集成的用戶體驗(yàn)。通過WebView顯示的Web內(nèi)容通?;谠O(shè)備上默認(rèn)的Web瀏覽器使用的相同渲染引擎,例如Google Chrome或Android瀏覽器(在Chrome成為默認(rèn)瀏覽器之前使用的瀏覽器)。這樣可以確保開發(fā)人員在不同的應(yīng)用程序中提供一致的Web體驗(yàn),并確保與Web標(biāo)準(zhǔn)和技術(shù)的兼容性。
webview是什么
webview是一個(gè)可視化的組件,是作為原生APP的視覺部分??梢詢?nèi)嵌在移動(dòng)端,實(shí)現(xiàn)前端的混合式開發(fā),大多數(shù)混合式開發(fā)框架都是基于WebView模式進(jìn)行二次開發(fā)的。比如:APIcloud、uni-app等等的框架。
一、webview入門知識(shí)
1、我們通常是用瀏覽器來瀏覽網(wǎng)頁,你很清楚的知道你正在使用瀏覽器,要么是PC客戶端,要么是手機(jī)上的app。但是webview是一個(gè)嵌入式的瀏覽器,是嵌入在原生應(yīng)用中的,你可能都意識(shí)不到你在用瀏覽器。
2、傳統(tǒng)瀏覽器分為兩個(gè)部分,UI(地址欄、導(dǎo)航欄)和瀏覽器引擎。webview就是原生應(yīng)用中的瀏覽器引擎。
3、webview只是一個(gè)可視化的組件,是作為原生APP的視覺部分。
4、用webview展示的內(nèi)容是不需要存儲(chǔ)在本地的,可以直接從服務(wù)器獲取。
5、這種靈活性打開了瀏覽器端的web應(yīng)用和希望展示在原生應(yīng)用中的web應(yīng)用代碼直接可重用的世界。
6、運(yùn)行在webview中的JS代碼有能力調(diào)用原生的系統(tǒng)API,沒有傳統(tǒng)瀏覽器沙箱的限制。
7、沙箱的存在是因?yàn)?,你永遠(yuǎn)不能完全信任加載的web內(nèi)容,所以不能允許它調(diào)用原生的系統(tǒng)API。而在webview中開發(fā)人員通??梢酝耆刂萍虞d的內(nèi)容,惡意代碼進(jìn)入并在設(shè)備上造成混亂的可能性很低。
8、在webview中,JS代碼可以跟原生應(yīng)用代碼相互通信,也可以調(diào)用原生API集成酷炫的系統(tǒng)級(jí)功能,如傳感器、存儲(chǔ)、日歷、聯(lián)系人等。
二、webview的用法
1、作為APP內(nèi)置瀏覽器,顯示鏈接的內(nèi)容。
2、用來顯示廣告。
3、完全承載APP內(nèi)的所有交互。從技術(shù)角度看這些仍是原生應(yīng)用,但它做的唯一原生操作就是托管webview,這種應(yīng)用被稱為混合應(yīng)用。從部署和更新的角度來看,混合應(yīng)用非常方便。
4、作為原生應(yīng)用的擴(kuò)展。許多原生應(yīng)用會(huì)提供加載項(xiàng)或擴(kuò)展程序來擴(kuò)展其功能,由于web技術(shù)的簡(jiǎn)單性和強(qiáng)大,這些加載項(xiàng)和擴(kuò)展通常以HTML、CSS、JS而不是C++、C#或其他來構(gòu)建。
三、webview的精髓
webview其實(shí)只是一個(gè)再應(yīng)用中設(shè)置好位置和大小的瀏覽器,而且不會(huì)放置任何花哨的UI。
在大多數(shù)情況下,除非你調(diào)用了原生API,否則不必在webview中專門測(cè)試web應(yīng)用。
WebView的幾個(gè)常見功能使用方法
android的WebView組件可以說是相當(dāng)?shù)膹?qiáng)大,現(xiàn)將項(xiàng)目中經(jīng)常用到的幾個(gè)功能總結(jié)如下:
一、背景設(shè)置
WebView.setBackgroundColor(0);//先設(shè)置背景色為transparent
WebView.setBackgroundResource(R.drawable.yourImage);//然后設(shè)置背景圖片
二、獲得WebView網(wǎng)頁加載初始化和完成事件
步驟:
1、創(chuàng)建一個(gè)自己的WebViewClient(繼承 WebViewClient 類)如WebViewClient
2、重載里面的 onPageFinished(WebView view, String url)方法,(webview加載完成會(huì)調(diào)用這個(gè)方法),這個(gè)方法放自己想要做的事情,在webview加載完成以后
3、關(guān)聯(lián)你自己的webviewclient 與 webview 通過 這個(gè)方法:webView.setWebViewClient( new WebViewClient();
如果需要監(jiān)視加載進(jìn)度的,需要?jiǎng)?chuàng)建一個(gè)自己的WebChromeClient類,并重載方法onProgressChanged,再
布局文件:
要注意的是,其中的webView的一系列用法,比如 webView.getSettings()。setJavaScriptEnabled(true);設(shè)置可以使用javscript;
等等,具體參考API
而進(jìn)度條的使用是在new出一個(gè)setWebChromeClient后,可以在內(nèi)部類中寫onProgressChanged事件
總結(jié):在WebView的設(shè)計(jì)中,不是什么事都要WebView類干的,有些雜事是分給其他人的,這樣WebView專心干好自己的解析、渲染工作就行了。
WebViewClient就是幫助WebView處理各種通知、請(qǐng)求事件的,具體來說包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
WebChromeClient是輔助WebView處理Javascript的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等
onCloseWindow(關(guān)閉WebView)
onCreateWindow()
onJsAlert (WebView上alert是彈不出來東西的,需要定制你的WebChromeClient處理彈出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持3322。
Android WebView的具體實(shí)現(xiàn)與Chromium渲染引擎啟動(dòng)過程
這里以Android 8.0的源碼為來說明,是先找到WebView的真正的構(gòu)造函數(shù):
這個(gè)構(gòu)造函數(shù)會(huì)調(diào)用另外一個(gè)成員函數(shù)ensureProviderCreated()確保Chromium動(dòng)態(tài)庫已經(jīng)加載。在Chromium動(dòng)態(tài)庫已經(jīng)加載的情況下,WebView類的成員函數(shù)ensureProviderCreated還會(huì)創(chuàng)建一個(gè)WebViewProvider對(duì)象,并且保存在成員變量mProvider中。這個(gè)WebViewProvider其實(shí)才是真正用來實(shí)現(xiàn)WebView的功能的幕后大佬。上訴那些Android WebView主要的方式基本都是通過mProvider來實(shí)現(xiàn)的,例如loadUrl(String url)等方法。
有了這個(gè)mProvider之后,WebView類的構(gòu)造函數(shù)就會(huì)繼續(xù)調(diào)用mProvider.init(javaScriptInterfaces, privatepowsing)啟動(dòng)網(wǎng)頁渲染引擎。對(duì)于基于Chromium實(shí)現(xiàn)的WebView來說,它使用的WebViewProvider是一個(gè)WebViewChromium對(duì)象。當(dāng)這個(gè)WebViewChromium對(duì)象的成員函數(shù)init被調(diào)用的時(shí)候,它就會(huì)啟動(dòng)Chromium的網(wǎng)頁渲染引擎。
所以,我們接下來看一下ensureProviderCreated的實(shí)現(xiàn):
WebView類的成員函數(shù)ensureProviderCreated首先調(diào)用成員函數(shù)checkThread確保它是在WebView的創(chuàng)建線程中調(diào)用的,接下來又會(huì)判斷成員變量mProvider的值是否為null。如果為null,就表示它還沒有當(dāng)前創(chuàng)建的WebView創(chuàng)建過Provider。在這種情況下,它首先會(huì)調(diào)用成員函數(shù)getFactory獲得一個(gè)WebViewFactory。有了這個(gè)WebViewFactory之后,就可以調(diào)用它的成員函數(shù)createWebView創(chuàng)建一個(gè)WebViewProvider。
接下來我們?cè)倏匆幌耮etFactory()方法以及它的實(shí)現(xiàn):
getFactory返回的WebView Factory是通過調(diào)用WebViewFactory類的靜態(tài)成員函數(shù)getProvider獲得的,getProvider首先是判斷靜態(tài)成員變量sProviderInstance的值是否等于null。如果等于null,那么就說明當(dāng)前的App進(jìn)程還沒有加載過Chromium動(dòng)態(tài)庫。在這種情況下,就需要加載Chromium動(dòng)態(tài)庫,并且創(chuàng)建一個(gè)WebView Factory,保存在靜態(tài)成員變量sProviderInstance。接下來我們就先分析Chromium動(dòng)態(tài)庫的加載過程,然后再分析WebView Factory的創(chuàng)建過程。
加載Chromium動(dòng)態(tài)庫是通過調(diào)用WebViewFactory類的靜態(tài)成員函數(shù)loadNativeLipary實(shí)現(xiàn)的:
loadNativeLipary首先會(huì)調(diào)用成員函數(shù)getWebViewNativeLiparyPaths獲得要加載的Chromium動(dòng)態(tài)庫的文件路徑,然后再調(diào)用另外一個(gè)靜態(tài)成員函數(shù)nativeLoadWithRelroFile對(duì)它進(jìn)行加載。在加載的時(shí)候,會(huì)指定一個(gè)Chromium GNURELRO Section文件。這個(gè)Chromium GNURELRO Section文件是系統(tǒng)啟動(dòng)時(shí)候,通過啟動(dòng)一個(gè)臨時(shí)進(jìn)程生成的。其中靜態(tài)成員函數(shù)nativeLoadWithRelroFile是一個(gè)JNI方法,它由C++層的函數(shù)LoadWithRelroFile實(shí)現(xiàn):
LoadWithRelroFile判斷自己是32位還是64位的實(shí)現(xiàn),然后從參數(shù)lib32和lib64中選擇對(duì)應(yīng)的Chromium動(dòng)態(tài)庫進(jìn)行加載。
這個(gè)加載過程是通過調(diào)用另外一個(gè)函數(shù)DoLoadWithRelroFile實(shí)現(xiàn)的:
函數(shù)DoLoadWithRelroFile的實(shí)現(xiàn)是通過Linker導(dǎo)出的函數(shù)androiddlopenext在Zyogote進(jìn)程保留的地址空間中加載Chromium動(dòng)態(tài)庫的。注意,App進(jìn)程是Zygote進(jìn)程fork出來的,因此它同樣會(huì)獲得Zygote進(jìn)程預(yù)留的地址空間。不過,函數(shù)DoLoadWithRelroFile會(huì)將告訴函數(shù)androiddlopenext在加載Chromium動(dòng)態(tài)庫的時(shí)候,將參數(shù)relro描述的Chromium GNURELRO Section文件內(nèi)存映射到內(nèi)存來,并且代替掉已經(jīng)加載的Chromium動(dòng)態(tài)庫的GNURELRO Section。這是通過將指定一個(gè)ANDROIDDLEXTUSERELRO標(biāo)志實(shí)現(xiàn)的。之所以可以這樣做,是因?yàn)閰?shù)relro描述的Chromium GNURELRO Section文件對(duì)應(yīng)的Chromium動(dòng)態(tài)庫的加載地址與當(dāng)前App進(jìn)程加載的Chromium動(dòng)態(tài)庫的地址一致。只要兩個(gè)相同的動(dòng)態(tài)庫在兩個(gè)不同的進(jìn)程中的加載地址一致,它們的鏈接和重定位信息就是完全一致的,因此就可以通過文件內(nèi)存映射的方式進(jìn)行共享。共享之后,就可以達(dá)到節(jié)省內(nèi)存的目的了。
這一步執(zhí)行完成之后,App進(jìn)程就加載完成Chromium動(dòng)態(tài)庫了?;氐角懊娣治龅腤ebViewFactory類的靜態(tài)成員函數(shù)getProvider,它接下來繼續(xù)創(chuàng)建一個(gè)WebViewFactory。這個(gè)WebViewFactory以后就可以用來創(chuàng)建WebViewProvider。
WebViewFactory類的靜態(tài)成員函數(shù)getProvider首先要確定要?jiǎng)?chuàng)建的WebView Factory的類型。這個(gè)類型是通過調(diào)用另外一個(gè)靜態(tài)成員函數(shù)getFactoryClass獲得的:
從這里可以看到,WebViewFactory類的靜態(tài)成員函數(shù)getFactoryClass返回的WebView Factory的類型為com.android.webview.chromium.WebViewChromiumFactoryProviderForO。這個(gè)com.android.webview.chromium.WebViewChromiumFactoryProviderForO類是由前面提到的WebView Package提供的。這意味著WebViewFactory類的靜態(tài)成員函數(shù)getProvider創(chuàng)建的WebView Factory是一個(gè)WebViewChromiumFactoryProvider對(duì)象:
WebViewChromiumFactoryProvider類的構(gòu)造函數(shù)會(huì)調(diào)用AwpowserProcess類的靜態(tài)成員函數(shù)loadLipary對(duì)前面加載的Chromium動(dòng)態(tài)庫進(jìn)行初始化:
AwpowserProcess類的靜態(tài)成員函數(shù)loadLipary又調(diào)用LiparyLoader類的靜態(tài)成員函數(shù)loadNow對(duì)前面加載的Chromium動(dòng)態(tài)庫進(jìn)行初始化:
LiparyLoader類的靜態(tài)成員函數(shù)loadNow又調(diào)用另外一個(gè)重載版本的靜態(tài)成員函數(shù)loadNow對(duì)前面加載的Chromium動(dòng)態(tài)庫進(jìn)行初始化:
LiparyLoader類重載版本的靜態(tài)成員函數(shù)loadNow又調(diào)用另外一個(gè)靜態(tài)成員函數(shù)loadAlreadyLocked對(duì)前面加載的Chromium動(dòng)態(tài)庫進(jìn)行初始化:
由于并不是所有的系統(tǒng)都支持在加載動(dòng)態(tài)庫時(shí),以文件內(nèi)存映射的方式代替它的GNURELRO Section,因此Chromium自己提供了一個(gè)Linker。通過這個(gè)Linker加載動(dòng)態(tài)庫時(shí),能夠以文件內(nèi)存映射的方式代替要加載的動(dòng)態(tài)庫的GNURELRO Section,也就是實(shí)現(xiàn)前面提到的函數(shù)androiddlopenext的功能。在高于Android 5.0中,由于系統(tǒng)已經(jīng)提供了函數(shù)androiddlopenext,因此,Chromium就不會(huì)使用自己的Linker加載動(dòng)態(tài)庫,而是使用Android系統(tǒng)提供的Linker來加載動(dòng)態(tài)庫。通過調(diào)用System類的靜態(tài)成員函數(shù)loadLipary即可以使用系統(tǒng)提供的Linker來加載動(dòng)態(tài)庫。LiparyLoader類的靜態(tài)成員函數(shù)loadAlreadyLocked要加載的動(dòng)態(tài)庫由NativeLiparies類的靜態(tài)成員變量LIpARIES指定:
從這里可以知道,LiparyLoader類的靜態(tài)成員函數(shù)loadAlreadyLocked要加載的動(dòng)態(tài)庫就是Chromium動(dòng)態(tài)庫。這個(gè)Chromium動(dòng)態(tài)庫前面已經(jīng)加載過了,因此這里通過調(diào)用System類的靜態(tài)成員函數(shù)loadLipary再加載時(shí),僅僅是只會(huì)觸發(fā)它導(dǎo)出的函數(shù)JNIOnLoad被調(diào)用,而不會(huì)重新被加載。Chromium動(dòng)態(tài)庫導(dǎo)出的JNIOnLoad被調(diào)用的時(shí)候,Chromium動(dòng)態(tài)庫就會(huì)執(zhí)行初始化工作:
其中的一個(gè)初始化操作是給Chromium的Content層設(shè)置一個(gè)類型為AwMainDelegate的Main Delegate。這個(gè)AwMainDelegate實(shí)現(xiàn)在Chromium的androidwebview模塊中。Android WebView是通過Chromium的androidwebview模塊加載和渲染網(wǎng)頁的。Chromium加載和渲染網(wǎng)頁的功能又是實(shí)現(xiàn)在Content層的,因此,Chromium的androidwebview模塊又要通過Content層實(shí)現(xiàn)加載和渲染網(wǎng)頁功能。這樣,Chromium的androidwebview模塊就可以設(shè)置一個(gè)Main Delegate給Content層,以便它們可以互相通信。給Chromium的Content層設(shè)置一個(gè)Main Delegate是通過調(diào)用函數(shù)SetContentMainDelegate實(shí)現(xiàn)的:
從前面的分析可以知道,參數(shù)delegate指向的是一個(gè)AwMainDelegate對(duì)象,這個(gè)AwMainDelegate對(duì)象會(huì)被函數(shù)SetContentMainDelegate保存在全局變量gcontentmain_delegate中。這一步執(zhí)行完成后,Chromium動(dòng)態(tài)庫就在App進(jìn)程中加載完畢,并且也已經(jīng)完成了初始化工作。與此同時(shí),系統(tǒng)也為App進(jìn)程創(chuàng)建了一個(gè)類型為WebViewChromiumFactoryProvider的WebViewFactory?;氐角懊娣治龅腤ebView類的成員函數(shù)ensureProviderCreated中,這時(shí)候就它會(huì)通過調(diào)用上述類型為WebViewChromiumFactoryProvider的WebViewFactory的成員函數(shù)createWebView為當(dāng)前創(chuàng)建的WebView創(chuàng)建一個(gè)WebView Provider:
WebViewChromiumFactoryProvider類的成員函數(shù)createWebView創(chuàng)建的是一個(gè)類型為WebViewChromium的WebView Provider。這個(gè)WebView Provider將會(huì)返回給WebView類的成員函數(shù)ensureProviderCreated。WebView類的成員函數(shù)ensureProviderCreated再將該WebView Provider保存在成員變量mProvider中。這樣,正在創(chuàng)建的WebView就獲得了一個(gè)類型為WebViewChromium的WebView Provider。以后通過這個(gè)WebView Provider,就可以通過Chromium來加載和渲染網(wǎng)頁了。
更新日志
v132.0.6834.79版本
更正了一些錯(cuò)誤并提升了速度
應(yīng)用截圖
相同廠商
-
google home apk 系統(tǒng)工具 / 178.69M
-
Google日歷2025新版 生活實(shí)用 / 29.73M
-
谷歌地圖手機(jī)版中文版 旅游出行 / 198.4M
-
谷歌文件極客App 系統(tǒng)工具 / 16.53M
-
Gboard Google 鍵盤App 系統(tǒng)工具 / 59.18M
-
Google Go最新版 網(wǎng)絡(luò)瀏覽 / 21.45M
-
Android Auto最新版 旅游出行 / 53.98M
-
Google幻燈片 辦公學(xué)習(xí) / 124.95M
-
谷歌健身App最新版 生活實(shí)用 / 32.27M
-
谷歌瀏覽器舊版本安卓版 網(wǎng)絡(luò)瀏覽 / 58.98M
-
谷歌遠(yuǎn)程桌面安卓版 系統(tǒng)工具 / 1.37M
猜您喜歡
- 安卓系統(tǒng)自帶app推薦
- 每次不小心刪掉了安卓系統(tǒng)自帶app找不回來怎么辦呢?今天小編就為大家精心整理了一些安卓手機(jī)自帶軟件,不管你是華為手機(jī)還是小米手機(jī),亦或者榮耀、oppo、vivo等等,這里都有相關(guān)手機(jī)系統(tǒng)軟件,可以滿足大量用戶的需求,而手機(jī)里面就自帶了很多系統(tǒng)軟件,不一定都是你習(xí)慣、喜歡的軟件,想換的話也可以在這里看看手機(jī)系統(tǒng)軟件大全,感興趣的朋友可以下載試試哦!
-
華為文件管理器官方版(華為云空間) 文件管理 / 42.15M
-
華為應(yīng)用市場(chǎng)2025最新版 系統(tǒng)工具 / 56.24M
-
oppo軟件商店官方正版 系統(tǒng)工具 / 70.34M
-
華為運(yùn)動(dòng)健康計(jì)步器手機(jī)版 穿戴設(shè)備 / 142.35M
-
華為商城App官方版(VMALL) 理財(cái)購物 / 91.06M
同類應(yīng)用
網(wǎng)友評(píng)論
共9人參與互動(dòng),3條評(píng)論- 第3樓中國–廣東–深圳網(wǎng)友發(fā)表于: 2024-11-11 14:04:08
- 提示不是64位的1蓋樓(回復(fù))
- 第2樓山東省臨沂市網(wǎng)友發(fā)表于: 2024-06-19 11:49:48
- 更新成功了,小米手機(jī)先關(guān)閉miui優(yōu)化再更新1蓋樓(回復(fù))
- 第1樓河南省許昌市網(wǎng)友發(fā)表于: 2024-04-23 00:11:35
- 怎么提示解折失敗1蓋樓(回復(fù))
- 管理員 回復(fù)發(fā)表于: 2024-04-23 17:57:03
- 小伙伴該軟件運(yùn)行需要設(shè)備搭載谷歌框架哦!2蓋樓(回復(fù))