Android開發(fā)之WebView(一)配置&小技巧

背景:原生時(shí)間緊沒時(shí)間開發(fā)任務(wù)量大的任務(wù)乍桂,而前端又閑著打醬油

方案:原生+webview混合開發(fā)

缺點(diǎn):對(duì)于比較復(fù)雜的頁面裆赵,webview在性能上力不從心搏嗡;且與原生通信頻繁也增加了隱藏的工作量

優(yōu)點(diǎn):能自帶支持動(dòng)態(tài)更新(js)蛀柴,能充分利用人力

一:WebView介紹

webview是一個(gè)基于webkit引擎劣坊,展示web頁面的控件嘀倒。Android上的webview在低版本和高版本采用了不同的webkit版本內(nèi)核,Android4.4(19)后直接使用了Chrome內(nèi)核局冰;WebView控件功能強(qiáng)大测蘑,除了具有一般View的屬性和設(shè)置外,還可以對(duì)url請(qǐng)求康二,頁面加載碳胳,渲染,頁面交互進(jìn)行強(qiáng)大的處理沫勿。一般來說webview可單獨(dú)使用挨约,也可聯(lián)合其工具類一起使用

移動(dòng)應(yīng)用的主體是webview,主要以網(wǎng)頁語言編寫产雹,穿插Native功能的Hybrid App開發(fā)類型诫惭。激活webview為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁的響應(yīng)洽故;當(dāng)webview 的頁面被失去焦點(diǎn)切換到后臺(tái)不可見狀態(tài)onPause時(shí)贝攒,需要通知自己暫停所有的動(dòng)作,比如DOM的解析时甚,plugin的執(zhí)行隘弊,JavaScript的執(zhí)行等

二:WebView的作用

1,顯示和渲染web頁面

2荒适,直接使用本地assets或者網(wǎng)絡(luò)上的html文件作為布局

3梨熙,可和JavaScript進(jìn)行互相調(diào)用

三:WebView的使用方式

1,直接在布局文件里寫死

2刀诬,動(dòng)態(tài)添加進(jìn)viewgroup中

注:不管以哪種方式咽扇,都必須注意webview的銷毀,否則可能會(huì)造成內(nèi)存泄漏最終導(dǎo)致內(nèi)存溢出crash

四:WebView常用方法及說明

下面是WebView的一些常用的方法列舉陕壹,一些已經(jīng)過時(shí)的方法未列出

webview.loadUrl("www.baidu.com")  //加載url
webview.loadurl("javascript:jsmethod()")  //可以執(zhí)行js函數(shù)质欲,沒有返回值,其中jsmethod是js中定義的函數(shù)
webview.evaluateJavascript(String script, ValueCallback<String> resultCallback)  //script同上糠馆,有返回值
webview.setWebViewClient(new WebViewClient());   //設(shè)置webviewclient嘶伟,通過重寫部分方法可以實(shí)現(xiàn)定制化的功能,攔截url又碌,監(jiān)控資源加載狀態(tài)等
webview.setWebChromeClient(new WebChromeClient()   //設(shè)置WebChromeClient九昧,重寫部分方法可以處理js的對(duì)話框绊袋,網(wǎng)址圖標(biāo),標(biāo)題和加載進(jìn)度等
webview.onPause()  //webview的生命周期方法铸鹰,可于activity的生命周期綁定調(diào)用癌别,通知webkit內(nèi)核暫停所有的動(dòng)作,比如DOM的解析蹋笼,plugin的執(zhí)行展姐,JavaScript的執(zhí)行
webview.onResume   //webview的生命周期方法,可于activity的生命周期綁定調(diào)用剖毯,通知webkit內(nèi)核恢復(fù)所有的動(dòng)作诞仓,比如DOM的解析,plugin的執(zhí)行速兔,JavaScript的執(zhí)行
webview.pauseTimers()   //和onPause搭配使用,針對(duì)全應(yīng)用程序的webview活玲,會(huì)暫停所有webview的layout涣狗,parsing,JavaScriptTimer舒憾,可降低CPU功耗镀钓,達(dá)到省電的目的
webview.resumeTimers()  //和onResume搭配使用,恢復(fù)pauseTimers時(shí)的所有動(dòng)作
webview.destroy()   //銷毀webview镀迂,一般在activity的onDestroy方法中調(diào)用丁溅,注意調(diào)用時(shí)需要先在父容器中移除webview,然后再銷毀探遵,如:( (ViewGroup) webView.getParent()).removeView(webView);
webview.stopLoading()  //停止當(dāng)前加載
webview.clearMatches()  //清除網(wǎng)頁查找的高亮匹配字符
webview.clearHistory()  //清除當(dāng)前webview的歷史訪問記錄
webview.clearCache(true)  //清空網(wǎng)頁訪問留下的緩存數(shù)據(jù)(內(nèi)存+磁盤)窟赏,為false時(shí)只清除內(nèi)存的
webview.loadUrl("about:blank")  //清空當(dāng)前加載
webview.removeAllViews()  //清空所有子view

五:WebSettings的常用配置方法及說明

下面是WebSettings的一些常用的方法列舉,一些已經(jīng)過時(shí)的方法就沒有寫出來了

WebSettings settings = webView.getSettings();
String ua = settings.getUserAgentString();
// 添加userAgent箱季,方便前端網(wǎng)頁判斷請(qǐng)求來源
settings.setUserAgentString(ua + "; app/1.0.0");
// 頁面中要與JavaScript交互涯穷,需要設(shè)置為true
settings.setJavaScriptEnabled(true);
// 設(shè)置允許JS彈窗
settings.setJavaScriptCanOpenWindowsAutomatically(true);
//保存表單數(shù)據(jù)
settings.setSaveFormData(true);
//將圖片調(diào)整到適合webview的大小
settings.setUseWideViewPort(true);
// 縮放至屏幕的大小
settings.setLoadWithOverviewMode(true);
//不支持縮放
settings.setSupportZoom(false);
//設(shè)置內(nèi)置的縮放控件,這個(gè)取決于setSupportZoom藏雏,如果setSupportZoom設(shè)置為false拷况,則此處設(shè)置無效
settings.setBuildInZoomControls(true);
//設(shè)置可以訪問文件,如果此處設(shè)置為false掘殴,則webview的input標(biāo)簽的type=‘file’將點(diǎn)擊無響應(yīng)
settings.setAllowFileAccess(true);
//支持多窗口
settings.setSupportMultipleWindows(true);
//支持內(nèi)容重新布局赚瘦,實(shí)戰(zhàn)發(fā)現(xiàn)此處如果設(shè)置為NARROW_COLUMN會(huì)導(dǎo)致某些手機(jī)顯示不能撐滿寬度問題
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//支持自動(dòng)加載圖片
settings.setLoadsImagesAutomatically(true);
//設(shè)置編碼格式
settings.setDefaultTextEncodingName("utf-8");
//設(shè)置默認(rèn)字體大小
settings.setDefaultFontSize(16);
//特別注意,5.1以上默認(rèn)禁止了https和http的混用奏寨,以下方式是開啟
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

六:WebView常見問題

1起意,引起內(nèi)存泄露

在使用webview中,不管是寫在xml里還是動(dòng)態(tài)生成的服爷,都會(huì)不可避免的將當(dāng)前的context傳入webview中杜恰,也就是webview持有當(dāng)前activity的引用获诈。在我們關(guān)閉activity的時(shí)候,如果此時(shí)webview還在加載就會(huì)導(dǎo)致activity無法被回收心褐,造成內(nèi)存泄漏舔涎;總結(jié)來說,就是由于多個(gè)對(duì)象的生命周期不一致導(dǎo)致的無法同生同滅

一般不管是動(dòng)態(tài)生成還是xml寫死逗爹,只要處理好了引用持有問題亡嫌,就能有效的避免內(nèi)存泄漏;下面是我嘗試的方案掘而,在工具類WebViewUtils.java里封裝好挟冠,在activity銷毀的時(shí)候調(diào)用

public static void release(WebView webView) {
        if (webView != null) {
            webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            webView.stopLoading();
            ViewGroup parent = (ViewGroup) webView.getParent();
            if (parent != null) {
                parent.removeView(webView);
            }
            webView.clearHistory();
            webView.removeAllViews();
            webView.destroy();
        }
    }

    @Override
    public void onDestroy() {
        WebViewUtils.release(mWebView);
        super.onDestroy();
    }
2,加載白屏

由于白屏問題的出現(xiàn)的多樣性袍睡,暫提供多種嘗試性方案知染,大家按需參考

1,清除webview緩存和記錄

webview.clearCache(true);
webview.clearHistory();

2斑胜,可以設(shè)置不啟用緩存

websettings.setAppCacheEnabled(false);

3控淡,H5的一些控件標(biāo)簽不支持導(dǎo)致的白屏

websettings.setDomStorageEnabled(true);

4,xml啟用軟件加速

 <WebView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layerType="software"
     android:scrollbars="none" />

5止潘,通過menifest的來配置掺炭,在目標(biāo)webview的activity設(shè)置

<activity
      android:name="xxx"
      android:hardwarAccelerated="false" />
3,安全&漏洞問題
  • Android 4.2前遠(yuǎn)程代碼執(zhí)行漏洞的問題凭戴,又稱js注入

這個(gè)問題也是老生常談的問題涧狮,其原因是因?yàn)樵贏PI 17(Android 4.2)以前的系統(tǒng)版本,程序沒有正確限制使用addJavascriotInterface方法么夫,遠(yuǎn)程攻擊者可通過使用Java Reflection API利用該漏洞執(zhí)行任意Java對(duì)象的方法者冤,可能出現(xiàn)手機(jī)被安裝木馬程序,發(fā)送扣費(fèi)短信档痪,通信錄或者短信被竊取譬嚣,甚至手機(jī)被遠(yuǎn)程控制等安全問題

解決方案:

1,設(shè)置minSdkVersion大于等于17钞它,即不能再低于4.2的手機(jī)上運(yùn)行
2拜银,在需要被調(diào)用的Java方法上增加注解聲明:@JavascriptInterface

  • webview明文存儲(chǔ)密碼的問題

webview組建默認(rèn)開啟了密碼保護(hù)功能,會(huì)提示用戶是否保存密碼遭垛,當(dāng)用戶選擇保存后尼桶,用戶名和密碼會(huì)被以明文形式保存到應(yīng)用數(shù)據(jù)目錄databases/webview.db中。攻擊者可能通過root的方式訪問該應(yīng)用的WebView數(shù)據(jù)庫锯仪,從而竊取本地明文存儲(chǔ)的用戶名和密碼

解決方案:

調(diào)用webview.getSettings().setSavePassword(false)泵督;,讓webview不再存儲(chǔ)密碼

  • 有風(fēng)險(xiǎn)的系統(tǒng)隱藏接口問題

根據(jù)CVE披露的webview的遠(yuǎn)程代碼執(zhí)行漏洞信息庶喜,Android系統(tǒng)中存在一共三個(gè)有遠(yuǎn)程代碼執(zhí)行漏洞的隱藏接口小腊。分別位于android/webkit/webview中的searchBoxJavaBridge接口救鲤,位于android/webkit/AccessibilityInjector的accessibility接口和accessibilityTraversal,調(diào)用此三個(gè)接口的APP在開啟輔助功能選項(xiàng)中第三方服務(wù)的Android系統(tǒng)上將面臨遠(yuǎn)程代碼執(zhí)行漏洞

解決方案:

需要顯示移除這三個(gè)接口

webview.removeJavascriptInterface("xxx");


文章如有錯(cuò)誤秩冈,煩請(qǐng)指出本缠。此篇文章作為后續(xù)深入的基礎(chǔ)鋪墊,后面會(huì)再續(xù)寫webview的cookie設(shè)置和Android的數(shù)據(jù)交互等入问,敬請(qǐng)期待丹锹!

上一篇:Flutter入門-01-工程創(chuàng)建&目錄介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芬失,隨后出現(xiàn)的幾起案子楣黍,更是在濱河造成了極大的恐慌,老刑警劉巖棱烂,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件租漂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颊糜,警方通過查閱死者的電腦和手機(jī)窜锯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芭析,“玉大人,你說我怎么就攤上這事吞瞪∧倨簦” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵芍秆,是天一觀的道長(zhǎng)惯疙。 經(jīng)常有香客問我,道長(zhǎng)妖啥,這世上最難降的妖魔是什么霉颠? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荆虱,結(jié)果婚禮上蒿偎,老公的妹妹穿的比我還像新娘。我一直安慰自己怀读,他們只是感情好诉位,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菜枷,像睡著了一般苍糠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啤誊,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天岳瞭,我揣著相機(jī)與錄音拥娄,去河邊找鬼。 笑死瞳筏,一個(gè)胖子當(dāng)著我的面吹牛稚瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乏矾,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼孟抗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了钻心?” 一聲冷哼從身側(cè)響起凄硼,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捷沸,沒想到半個(gè)月后摊沉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年滑沧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胖笛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尼斧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试吁,到底是詐尸還是另有隱情棺棵,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布熄捍,位于F島的核電站烛恤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏余耽。R本人自食惡果不足惜缚柏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟贾。 院中可真熱鬧币喧,春花似錦、人聲如沸袱耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛邑。三九已至怜浅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恶座。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工搀暑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跨琳。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓自点,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脉让。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桂敛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344