WebView 與 Java 代碼的交互

Webview 形式的控件是實(shí)現(xiàn) Hybrid App 的唯一途徑邻梆,android 4.4 以后的 webview 簡直太好用了澡罚,4.4 以前也能通過集成 chrome 內(nèi)核解決兼容性問題比规。我們項(xiàng)目已經(jīng)把用戶注冊(cè)登錄和用戶反饋全部改成了
Webview 的方式肺孵,并且整個(gè)項(xiàng)目只有一個(gè) Activity 放置了 webview 控件待诅,那要怎么才能滿足多個(gè)業(yè)務(wù)需求了。

眾所周知 webview 里的 js 代碼和 java 代碼相互調(diào)用检碗, 需要把 java 的對(duì)象傳到 javascript,它通過 addJavascriptInterface 的方式添加码邻。所以可以在這個(gè) activity 里動(dòng)態(tài)設(shè)置 java 的對(duì)象后裸,但問題是, intent 傳遞 object 對(duì)象顯得比較麻煩冒滩,于是乎微驶,我用了一個(gè)單例存放需要調(diào)用的 java 對(duì)象。

public enum JsInvoke {
    instance;
    private HashMap<String, Object> objs;

    public JsInvoke clear() {
        if (objs == null)
            objs = new HashMap<>();
        else objs.clear();
        return this;
    }

    public HashMap<String, Object> getObjs() {
        return objs;
    }

    public void add(String key, Object obj) {
        if (objs == null) return;
        objs.put(key, obj);
    }
}

當(dāng)我需要打開一個(gè) web 頁面時(shí)开睡,則通過下列方式傳遞 java 對(duì)象:

JsInvoke.instance.clear().add("time", new Date());

這樣就很方便傳遞對(duì)象了因苹。

接下來就是 js ,每次調(diào)用都會(huì)進(jìn)行一些判斷篇恒,比如:

if (typeof app !== 'undefined' && typeof app.hello !=='undefined'){
       app.hello('hello world');
}

這就顯得比較繁瑣了扶檐,由于 java 調(diào)用對(duì)象會(huì)在 window 對(duì)象中注冊(cè),可以考慮從 window 對(duì)象中判斷胁艰,寫一個(gè)原生方法的 js 調(diào)用方法:

function nativeCall(ns, fn, paras) {
    if (typeof window[ns] === 'undefined') return null;
    if (typeof window[ns] !== 'object') return null;
    if (typeof window[ns][fn] === 'undefined') return null;
    if (typeof window[ns][fn] !== 'function') return null;
    return window[ns][fn](paras);
}

接下來假設(shè) 需要調(diào)用的 java 對(duì)象的類名為 Test款筑,方法名為 demo,參數(shù)為字符串 hello world腾么,則只需要用下列代碼即可:

nativeCall('Test','demo','hello world');

這是無參返回的奈梳,有參返回的聲明一個(gè)變量接收杰克,夠簡單了吧 :)

本文在同步 公眾號(hào) 天兵公園 解虱,簡書同步發(fā)布攘须,如需轉(zhuǎn)載請(qǐng)事先聯(lián)系。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末殴泰,一起剝皮案震驚了整個(gè)濱河市于宙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悍汛,老刑警劉巖捞魁,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異离咐,居然都是意外死亡谱俭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺上,“玉大人瓶蚂,你說我怎么就攤上這事⌒ǎ” “怎么了窃这?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長征候。 經(jīng)常有香客問我杭攻,道長,這世上最難降的妖魔是什么疤坝? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任兆解,我火速辦了婚禮,結(jié)果婚禮上跑揉,老公的妹妹穿的比我還像新娘锅睛。我一直安慰自己,他們只是感情好历谍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布现拒。 她就那樣靜靜地躺著,像睡著了一般望侈。 火紅的嫁衣襯著肌膚如雪印蔬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天脱衙,我揣著相機(jī)與錄音侥猬,去河邊找鬼。 笑死捐韩,一個(gè)胖子當(dāng)著我的面吹牛退唠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥帘,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼铜邮,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了寨蹋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扔茅,失蹤者是張志新(化名)和其女友劉穎已旧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召娜,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡运褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秸讹。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檀咙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璃诀,到底是詐尸還是另有隱情弧可,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布劣欢,位于F島的核電站棕诵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凿将。R本人自食惡果不足惜校套,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牧抵。 院中可真熱鬧笛匙,春花似錦、人聲如沸犀变。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛作。三九已至涕蜂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間映琳,已是汗流浹背机隙。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萨西,地道東北人有鹿。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像谎脯,于是被迫代替她去往敵國和親葱跋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容