Android與JS代碼交互

現(xiàn)如今,很多Android APP都要與JS進行交互状原,而WebView就是Android與JS交互的橋梁蠢笋,日常中最常見Android和JS交互有:APP注冊協(xié)議梨睁,APP里的文章,APP里的活動頁,這都是嵌套的H5頁面关划。

Android與JS交互有以下邏輯步驟:

  • 創(chuàng)建WebView
  • 創(chuàng)建Html文件
  • 創(chuàng)建JS文件
  • WebView調用JS代碼
  • JS代碼中調用Android代碼

1. 創(chuàng)建WebView
創(chuàng)建一個布局文件小染,布局文件中包含著一個WebView控件:在activity中獲得這個這個WebView控件的實例

mWebView = findViewById(getResources().getIdentifier("web_view", "id", getPackageName()));

2. 創(chuàng)建Html文件
在main文件夾下創(chuàng)建assets文件夾,在其中再創(chuàng)建一個js文件夾, js文件夾就是放js代碼祭玉,html文件可以直接放在assets文件夾下
創(chuàng)建一個test.html的文件氧映,添加如下代碼:

<html>
    <script src="js/jquery-2.2.4.min.js"></script>

    <script type="text/javascript">
            var userAgent = navigator.userAgent || navigator.vendor || window.opera;
            console.log(userAgent)
            if(userAgent.match(/Android/i)) {
                $.getScript("js/android.js")
            }
    </script>
    Java-Javascript Interaction In Android
</html>

上面的html中做了兩件事情:
第一件事情就是:添加了一個jquery的插件,下載好:jquery-2.2.4.min.js放在assets/js目錄下
第二件事情就是:判斷當前用戶所處的運行環(huán)境是不是Android下脱货,如果是Android下岛都,去加載js目錄下的android.js文件

3. 創(chuàng)建JS文件
接下來我們就是創(chuàng)建android.js文件,代碼如下

$(function(){
    document.body.style.webkitTouchCallout='none';
    document_loaded();
});
function document_loaded() {
    console.log("document loaded");
    window.JsObject.documentLoaded();
}

function sayHello() {
    alert("Hello")
 }

function sumToJava(number1, number2){
    window.JsObject.onSumResult(number1 + number2)
 }

在android.js文件中振峻,我們定義了兩個方法:
一個是sayHello方法臼疫,這個方法中,是在h5頁面中彈出一個對話框扣孟,并且系那是syaHello
一個是sumToJava方法烫堤,在這里進行number1+number2運算,并且通過:
window.JsObject.onSumResult(number1 + number2)調用Java代碼凤价,這里很關鍵鸽斟,后面會著重描述,

4. WebView調用JS代碼
在activity中調用loadwebView函數(shù)利诺,在函數(shù)里面富蓄,首先是讓webView支持js, 再通過字符流的方式將html文件讀出來,利用loadDataWithBaseURL將其加載出來慢逾。
最后調用了testMethod函數(shù)中的webView.loadUrl()函數(shù)

@SuppressLint("JavascriptInterface")
    private void loadWebView(){
        mWebView.getSettings().setJavaScriptEnabled(true);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
            mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        }
        StringBuilder content = new StringBuilder();
        InputStream stream;
        try {
            stream = this.getAssets().open("test.html");
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            while((line = reader.readLine()) != null)
            {
                content.append(line);
                content.append('\n');
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String html = content.toString();
        mWebView.addJavascriptInterface(new JsObject(), "JsObject");
        mWebView.loadDataWithBaseURL("file:///android_asset/",html,"text/html","utf-8",null);
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                testMethod(mWebView);
            }
        });
    }

    private void testMethod(WebView webView){
        String call = "javascript:sayHello()";
        //call = "javascript:sumToJava(1,2)";
        webView.loadUrl(call);
     
    }

Android調用JS的關鍵就是通過這兩行代碼實現(xiàn)的立倍,就是調用了js代碼中的sayHello函數(shù)

String call = "javascript:sayHello()";
webView.loadUrl(call);

這樣子就是實現(xiàn)了Java代碼與Js代碼交互的邏輯,運行就會出現(xiàn)一個彈框侣滩,上面寫著:Hello

如果是調用js代碼中的sumToJava()函數(shù)口注,就直接把下面這行注釋給干掉:

call = "javascript:sumToJava(1,2)";

5. JS代碼調用Android代碼

創(chuàng)建一個Java類

public class JsObject {
    private final static String TAG = "TAG_JsObject";
    
    @JavascriptInterface
    public void onSumResult(int result){
        Log.d(TAG, "result = " + result);
    }
}

上面在類中添加了一個onSumResult的函數(shù),添加了JavascriptInterface注解, 這個onSumResult()函數(shù)就是為js代碼提供調用Java代碼的接口君珠,那它是怎么使用呢寝志?

就是上面js文件中的sumToJava()函數(shù):

function sumToJava(number1, number2){
    window.JsObject.onSumResult(number1 + number2)
 }

這里的window后面的JsObject,是怎么來的呢葛躏,查看webView的配置澈段,看到:

mWebView.addJavascriptInterface(new JsObject(), "JsObject");

對,就是后面的第二個字符串參數(shù)舰攒,這里是:JsObject败富,則調用就是:

window.JsObject.onSumResult(number1 + number2)

如果是:JsObject2, 調用就是:

window.JsObject2.onSumResult(number1 + number2)

好了摩窃,本文就到這里兽叮。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末芬骄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹦聪,更是在濱河造成了極大的恐慌账阻,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽本,死亡現(xiàn)場離奇詭異淘太,居然都是意外死亡,警方通過查閱死者的電腦和手機规丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門蒲牧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赌莺,你說我怎么就攤上這事冰抢。” “怎么了艘狭?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵挎扰,是天一觀的道長。 經(jīng)常有香客問我巢音,道長遵倦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任官撼,我火速辦了婚禮骇吭,結果婚禮上,老公的妹妹穿的比我還像新娘歧寺。我一直安慰自己,他們只是感情好棘脐,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布斜筐。 她就那樣靜靜地躺著,像睡著了一般蛀缝。 火紅的嫁衣襯著肌膚如雪顷链。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天屈梁,我揣著相機與錄音嗤练,去河邊找鬼。 笑死在讶,一個胖子當著我的面吹牛煞抬,可吹牛的內容都是我干的。 我是一名探鬼主播构哺,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼革答,長吁一口氣:“原來是場噩夢啊……” “哼战坤!你這毒婦竟也來了?” 一聲冷哼從身側響起残拐,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤途茫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溪食,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囊卜,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年错沃,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅组。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡捎废,死狀恐怖笑窜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情登疗,我是刑警寧澤排截,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站辐益,受9級特大地震影響断傲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜智政,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一认罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧续捂,春花似錦垦垂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矾克,卻和暖如春页慷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胁附。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工酒繁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人控妻。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓州袒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弓候。 傳聞我的和親對象是個殘疾皇子稳析,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容