混合開(kāi)發(fā)js與Andorid互調(diào)

作者:IT魔幻師
博客:www.huyingzi.top
轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/23f74055e999


一、Android端初始配置

  • 定義java類
    在需要被調(diào)用的Java函數(shù)加上@JavascriptInterface注解

    /**
     * @項(xiàng)目名: JsOrJavaDemo
     * @包名: com.hubin.jsorjavademo
     * @文件名: JavaScriptBridge
     * @創(chuàng)建者: 胡英姿
     * @創(chuàng)建時(shí)間: 2018/8/24 16:13
     * @描述: 與js交互的接口類
     */
    public class JavaScriptBridge{
        private Context mContext;
    
        public JavaScriptBridge(Context context, WebView webview) {
            mContext = context;
        }
    
        /**
         * 提供js調(diào)用彈出java  toast
         * @param msg
         */
        @JavascriptInterface //android4.2 以上换吧,js調(diào)用android方法有安全問(wèn)題
        public void showTast(String msg){
            Toast.makeText(mContext, ""+msg, Toast.LENGTH_SHORT).show();
        }
    
    }
    
  • 配置webview赢赊,建立映射關(guān)系

    //創(chuàng)建JavaScriptBridge
    JavaScriptBridge jsBridge = new JavaScriptBridge(mContext);
    //設(shè)置js和android通信橋梁接口 JavaScriptBridge 對(duì)應(yīng)映射字段-->jsInterface;
    Webview.addJavascriptInterface(jsBridge, "jsInterface");
    
    
    mWebview.getSettings().setJavaScriptEnabled(true);
    //加載本地模板筝闹,需要將web相關(guān)代碼放置assets目錄下
    mWebview.loadUrl("file:///android_asset/index.html");//本地模板
    

二街图、js調(diào)用Android方法

//使用json格式
var json = {"message":"你好阻荒,我是js"};
//對(duì)象.方法名(參數(shù))
window.jsInterface.showTast(JSON.stringify(json));

三闻丑、Android調(diào)用js方法

  • js端:定義一個(gè)函數(shù)漩怎,參數(shù)約定json格式

    //接收json對(duì)象
    function showMsg(json){
       var message = json.message;
       var name = json.name;
       showLog("name="+name+",message="+message);
       alert(JSON.stringify(json));
    };
    
  • Android端,調(diào)用js需在UI線程執(zhí)行

    //使用json格式封裝參數(shù)
    JSONObject json = new JSONObject();
    json.put("name", "android");
    json.put("message", "Hello Android world嗦嗡!");
    
    //切換到主線程
     mHandler.post(new Runnable() {
          @Override
          public void run() {
             //調(diào)用js方法webview.loadUrl("javascript:方法名(參數(shù))");
          mWebview.loadUrl("javascript:showMsg("+json.toString()+")");
          }
     });
    
    

四勋锤、引入CallBack實(shí)現(xiàn)Android回調(diào)并解耦

  • js端定義回調(diào)回函

    function receiveAndroid(json){
        showLog("接收android回調(diào)數(shù)據(jù)="+JSON.stringify(json));
    };
    
  • js調(diào)用Android函數(shù)

    //調(diào)用android獲取數(shù)據(jù)函數(shù)
    //json中約定callback字段,字段值為js中定義的接收函數(shù)名字
    var json = {"callback":"receiveAndroid"};
    window.jsInterface.getData(JSON.stringify(json));
    
  • Android端定義getData函數(shù)侥祭,解析json中約定的回調(diào)函數(shù)名叁执,拿到數(shù)據(jù)后回調(diào)給js

    @JavascriptInterface
    public void getData(String jsJson){
        //從服務(wù)器獲取json數(shù)據(jù)
        try {
            //解析js callback字段中的函數(shù)名字
            JSONObject jsonObject = new JSONObject(jsJson);
            final String callback = jsonObject.optString("callback");
    
            showLog("js回調(diào)方法="+callback);
    
            final JSONObject json = new JSONObject();
            json.put("hotel_name", "8天連鎖");
            json.put("hotel_price", "28.88塊錢");
            json.put("hotel_address", "廣東省 深圳市 寶安區(qū)");
    
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    //android調(diào)用js方法必須在主線程
                    mWebview.loadUrl("javascript:"+callback+"(" + json.toString() + ")");
                }
            });
    
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茄厘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谈宛,更是在濱河造成了極大的恐慌次哈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吆录,死亡現(xiàn)場(chǎng)離奇詭異窑滞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恢筝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門哀卫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撬槽,你說(shuō)我怎么就攤上這事聊训。” “怎么了恢氯?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵带斑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我勋拟,道長(zhǎng)勋磕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任敢靡,我火速辦了婚禮挂滓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啸胧。我一直安慰自己赶站,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布纺念。 她就那樣靜靜地躺著贝椿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陷谱。 梳的紋絲不亂的頭發(fā)上烙博,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音烟逊,去河邊找鬼渣窜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宪躯,可吹牛的內(nèi)容都是我干的乔宿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼访雪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼详瑞!你這毒婦竟也來(lái)了囤官?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛤虐,失蹤者是張志新(化名)和其女友劉穎党饮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驳庭,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刑顺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饲常。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹲堂。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贝淤,靈堂內(nèi)的尸體忽然破棺而出柒竞,到底是詐尸還是另有隱情,我是刑警寧澤播聪,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布朽基,位于F島的核電站,受9級(jí)特大地震影響离陶,放射性物質(zhì)發(fā)生泄漏稼虎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一招刨、第九天 我趴在偏房一處隱蔽的房頂上張望霎俩。 院中可真熱鬧,春花似錦沉眶、人聲如沸打却。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柳击。三九已至,卻和暖如春传藏,著一層夾襖步出監(jiān)牢的瞬間腻暮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工毯侦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人具垫。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓侈离,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親筝蚕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卦碾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345