Android webview和js交互


剛登進來的時候看到博客園的首頁好像改了,比之前好看很多了,也希望博客園可以越做越好!加油啊!

最近又對webview進行了一遍掃盲,對於webview和js交互這塊理解比之前更深了一點,在這里記錄下,以后忘了可以直接翻自己的博客來做。吐槽一下,csdn現狀,吵來吵去,標注20年發布的文章,抄的卻是人家11年發布的。有時候百度一搜,十幾條csdn,一摸一樣的內容,有些人抄博客連稱呼都不改的。

牢騷發完了,講講js交互。

首先要想要交互,就必須允許webview加載js,比較小白的事,但還是要提醒。

webSettings.setJavaScriptEnabled(true);

android和js交互主要是在webview上實現的。怎么使用webview也不多說了,比較基礎的東西。貼一下官方的地址。

https://developer.android.google.cn/guide/webapps/webview

這里講了js怎么調用android的方法。寫的也很詳細,代碼也簡單,我就做一個搬運工吧。

    public class WebAppInterface {
        Context mContext;

        /** Instantiate the interface and set the context */
        WebAppInterface(Context c) {
            mContext = c;
        }

        /** Show a toast from the web page */
        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
    }
    

創建一個這樣的類,注意,@JavascriptInterface這個,表示js可以調用這個方法。不加的js調用方法的時候會報一個方法不存在的錯。

    WebView webView = (WebView) findViewById(R.id.webview);
    webView.addJavascriptInterface(new WebAppInterface(this), "Android");
   

這塊我把它理解成channel,創建了一個js和webview的通道,然后通道里是js可以調用的方法,“android”這個是通道的標示,要跟js上對應起來。

    <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

    <script type="text/javascript">
        function showAndroidToast(toast) {
            Android.showToast(toast);
        }
    </script>
    

直接上對應的js方法,可以看到。Android.showToast即調用webview的showToast方法。(注:這里的Android和前面“Android”是對應的,自己寫個demo跑一跑就明白了。)

不過當然還可以在android端去攔截要加載的url來實現方法,這塊我給的鏈接里有,就在下面。我個人不太喜歡這種方法,不太純粹。這里就不介紹了。

android調用js的方法

上面這些官網都有,我的文筆也不太行,沒看明白的可以直接去翻官網。而且百度也能出來一堆。但是接下來講的,我還沒在官網里找到詳細介紹的(官網肯定都有,不過介紹的詳細與否就不清楚了)

然后自己稍微總結了下。

用的是webview的evaluateJavascript方法。文字描述不如代碼來的直接。

String js = String.format("jsFunction(%s",string);
webView.evaluateJavascript(js,new ValueCallback<String>() {
  @Override
  public void onReceiveValue(String value) {
    Log.i("TAG",value+"!!!");
  }
});

這個就是直接調用js的方法( jsFunction(string) ),這個方法存在js這邊,有沒有參數,有幾個參數都隨js這邊來定。放參數主要是為了把android這邊的數據回調給js。

 

這樣一套組合拳,就可以完成js和android端的交互。當需要調用原生這邊的方法的時候,使用第一種方法,並且傳參數過去。然后把數據處理完使用第二種方法,再還給js。

還有就是,webview需要處於一個handle之下!!!不然調用方法會報錯,要使用的時候把用getMainlooper拿過來。

東西比較簡單,mark一下記錄自己的成長。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM