1. 前言
- 現(xiàn)在很多的App里都內(nèi)置了Web網(wǎng)頁(yè)(Hybrid App),比如說(shuō)很多電商平臺(tái),淘寶、京東、聚劃算等等
- 他們的頁(yè)面是由Android的WebView實(shí)現(xiàn)的,其中涉及到Android客戶端與Web網(wǎng)頁(yè)的交互
2. 交互方式總結(jié)
對(duì)于Android調(diào)用JS代碼的方法有2種:
1.通過(guò)WebView的loadUrl()
2.通過(guò)WebView的evaluateJavascript()
對(duì)于JS調(diào)用Android代碼的方法有3種:
1.通過(guò)WebView的addJavascriptInterface()進(jìn)行對(duì)象映射
2.通過(guò) WebViewClient 的shouldOverrideUrlLoading ()方法回調(diào)攔截 url
3.通過(guò) WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調(diào)攔截JS對(duì)話框alert()、confirm()、prompt() 消息
3. 對(duì)比

4.WebView的坑
Ⅰ.WebView的銷毀和內(nèi)存泄漏問(wèn)題。WebView的完全銷毀是件麻煩事,一旦銷毀流程不正確,極易容易導(dǎo)致內(nèi)存泄漏。
原因:WebView會(huì)關(guān)聯(lián)一個(gè)Activity,Web4View執(zhí)行的操作是在新線程當(dāng)中回收,時(shí)間Activity沒(méi)有辦法確認(rèn),Activity的生命周期和WebView線程生命周期不一致導(dǎo)致WebView一直執(zhí)行,因?yàn)閃ebView內(nèi)部持有Activity的引用,導(dǎo)致Activity一直不能被回收,原理類似于匿名內(nèi)部類持有外部類的引用一樣。那么如何解決呢?
解決方案如下:
a.使含WebView的界面在獨(dú)立進(jìn)程(銷毀時(shí)System.exit(0)),簡(jiǎn)單暴力,涉及到進(jìn)程間通信。(開發(fā)過(guò)程中常用)
b.動(dòng)態(tài)添加WebView,對(duì)傳入WebView中使用Context弱引用,動(dòng)態(tài)添加WebView意思在布局中創(chuàng)建一個(gè)ViewGroup用來(lái)放置WebView,Activity創(chuàng)建add進(jìn)來(lái),Activity停止時(shí)remove掉。