国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android-Java和JavaScript相互調(diào)用

codeGoogle / 2954人閱讀

摘要:首先定義一個(gè)方法給調(diào)用在中直接調(diào)用該方法可以在中給方法直接傳參,如果方法有返回值,使用是無(wú)法獲取到返回值的,需要返回值給的話,可以定義一個(gè)方法提供給調(diào)用,然后調(diào)用之后,觸發(fā)該方法把返回值再傳遞給。

當(dāng)前的Android開(kāi)發(fā)中,會(huì)使用大量的h5(html5+css3+js),甚至出現(xiàn)了混合開(kāi)發(fā)模式(Hybrid),使用Hybrid開(kāi)發(fā),h5頁(yè)面開(kāi)發(fā)效率高和移植便利性為主。
但在一些地方使用h5開(kāi)發(fā)的確會(huì)不太容易實(shí)現(xiàn),這個(gè)時(shí)候就需要調(diào)用Java原生方法來(lái)完成,就會(huì)遇到JavasSript和Java相互調(diào)用,用Java原生方法實(shí)現(xiàn)那些Javascript代碼不容易實(shí)現(xiàn)的功能,比如,異步線程,調(diào)用數(shù)據(jù)庫(kù)等..... 然后再暴露給JavaScript調(diào)用。

JavascriptInterface

Android 4.2之前使用addjavascriptinterface可以把原生的Java方法,給JavaScript調(diào)用,但是這種方案卻存在安全風(fēng)險(xiǎn),在頁(yè)面中執(zhí)行一些不可信的Javascript代碼即有可能控制用戶的手機(jī),詳情見(jiàn):WebView中接口隱患與手機(jī)掛馬利用
Android 4.2之后提供了@JavascriptInterface對(duì)象注解的方式建立Javascript對(duì)象和android原生對(duì)象的綁定,提供給JavaScript調(diào)用的方法必須帶有@JavascriptInterface。
當(dāng)前4.0及4.0之前的系統(tǒng)市場(chǎng)占有量已經(jīng)很低了,因此可以考慮使用minSdkVersion為17,只支持4.2版本以上的手機(jī),低版本的系統(tǒng)不再支持了。
下面就看下Java和Javascript是如何通信的。

加載本地html

為了方便使用,下面使用的示例,不會(huì)使用server,所以就需要在webview中使用本地的html文件,為了方便把html文件都放在assets文件夾中,使用本地加載的方式,這樣就不需要服務(wù)器的支持了。
先定義一個(gè)html文件:



    
        

this is html

使用file:///android_asset/index.html加載到webview中:

    private void initView() {
        webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("file:///android_asset/index.html");
    }

下面就可以在index.html中試用Java和JavaScript的調(diào)用了。

Javascript調(diào)用Java方法

以Android的Toast的為例,下面看下如何從Javascript代碼中調(diào)用系統(tǒng)的Toast
先定義一個(gè)AndroidToast的Java類,它有一個(gè)show的方法用來(lái)顯示Toast:

public class AndroidToast {
        @JavascriptInterface
        public void show(String str) {
            Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
        }
    }

再對(duì)WebView進(jìn)行設(shè)置,開(kāi)啟JavaScipt,注冊(cè)JavascriptInterface的方法:

private void initView() {
        webView = (WebView) findViewById(R.id.webView);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDefaultTextEncodingName("UTF-8");
        webView.addJavascriptInterface(new AndroidToast(), "AndroidToast");
        webView.loadUrl("file:///android_asset/index.html");
 }

addJavascriptInterface的作用是把AndroidToast類映射為Javascript中的AndroidToast。這樣就可以在JavaScript中調(diào)用Java中的方法了。
在Javascript中調(diào)用Java代碼:

function toastClick(){
        window.AndroidToast.show("from js");
}

通過(guò)window屬性可以找到映射的對(duì)象AndroidToast,直接調(diào)用它的show方法即可。
注意這里傳輸?shù)臄?shù)據(jù)只能是基本數(shù)據(jù)類型和string,可以傳輸string就意味著可以使用json傳輸結(jié)構(gòu)化數(shù)據(jù)。
這里調(diào)用的方法并沒(méi)有返回值,如果需要在JavaScript中需要得到返回值怎么辦呢?

JavaScript調(diào)用Java有返回值

如果想從Javascript調(diào)的方法里面獲取到返回值,只需要定義一個(gè)帶返回值的@JavascriptInterface方法即可:

    public class AndroidMessage {
        @JavascriptInterface
        public String getMsg() {
            return "form java";
        }
    }

添加Javascript的映射:

webView.addJavascriptInterface(new AndroidMessage(), "AndroidMessage");

在JavaScript直接調(diào)用:

function showAlert(){
        var str=window.AndroidMessage.getMsg();
        console.log(str);
 }

這樣就完成了有返回值的方法調(diào)用。還有一種場(chǎng)景是,在Java中主動(dòng)觸發(fā)JavaScript方法,就需要在Java中調(diào)用JavaScript方法了。

Java調(diào)用JavaScript方法

Java在調(diào)用JavaScript方法的時(shí)候,需要使用WebView.loadUrl()方法,它可以直接在頁(yè)面里執(zhí)行JavaScript方法。
首先定義一個(gè)JavaScript方法給Java調(diào)用:

function callFromJava(str){
        console.log(str);
    }

在Java中直接調(diào)用該方法:

public void  javaCallJS(){
        webView.loadUrl("javascript:callFromJava("call from java")");
    }

可以在loadUrl中給Javascript方法直接傳參,如果JavaScript方法有返回值,使用WebView.loadUrl()是無(wú)法獲取到返回值的,需要JavaScript返回值給Java的話,可以定義一個(gè)Java方法提供給JavaScript調(diào)用,然后Java調(diào)用JavaScript之后,JavaScript觸發(fā)該方法把返回值再傳遞給Java。
注意WebView.loadUrl()必須在Ui線程中運(yùn)行,不然會(huì)會(huì)報(bào)錯(cuò)。

項(xiàng)目地址:https://github.com/jjz/androi...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79147.html

相關(guān)文章

  • Android-JavaJavaScript相互調(diào)用

    摘要:首先定義一個(gè)方法給調(diào)用在中直接調(diào)用該方法可以在中給方法直接傳參,如果方法有返回值,使用是無(wú)法獲取到返回值的,需要返回值給的話,可以定義一個(gè)方法提供給調(diào)用,然后調(diào)用之后,觸發(fā)該方法把返回值再傳遞給。 當(dāng)前的Android開(kāi)發(fā)中,會(huì)使用大量的h5(html5+css3+js),甚至出現(xiàn)了混合開(kāi)發(fā)模式(Hybrid),使用Hybrid開(kāi)發(fā),h5頁(yè)面開(kāi)發(fā)效率高和移植便利性為主。但在一些地方使用...

    _Suqin 評(píng)論0 收藏0
  • Android-Java面試

    摘要:好不容易在月號(hào)這天中午點(diǎn)左右接到了來(lái)自阿里的面試電話。這里會(huì)不斷收集和更新基礎(chǔ)相關(guān)的面試題,目前已收集題。面試重難點(diǎn)的和的打包過(guò)程多線程機(jī)制機(jī)制系統(tǒng)啟動(dòng)過(guò)程,啟動(dòng)過(guò)程等等掃清面試障礙最新面試經(jīng)驗(yàn)分享,此為第一篇,開(kāi)篇。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 各大公司 Java 后端開(kāi)發(fā)面試題總結(jié) 各大公司 Jav...

    TalkingData 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<