天天看點

安卓調用WebView中的js字元串生成工具

在安卓中,調用WebView中的js函數,在平台支援的情況下,可選使用 

evaluateJavascript 或 loadUrl

本文中使用 loadUrl 方式

重寫 SerializeJson 後使用即可

1 public abstract class WebViewJsHelper
 2 {
 3     //重寫此函數,傳回對象o的json字元串
 4     public abstract String SerializeJson(Object o);
 5     //模闆如下:
 6     //javascript:window["callBack"]({ a: "b" }, "b");
 7     public String getCallFunctionString(String functionName, Object... paramArr)
 8     {
 9         StringBuilder sb = new StringBuilder();
10         //使用數組方式調用,可以支援非法變量名的情況,使用 evaluateJavascript方式時,隻需要去掉下行中的 “javascript:”
11         sb.append("javascript:window['");
12         //字元串用了雙引号括起來,是以需要處理單引号,以支援functionName中包含單引号的情況
13         //一個反斜杠'\'用在replace和replaceAll中需要用4個反斜杠"\\\\"來表示
14         //單引号本身在java字元串及正則中均不需要轉義
15         sb.append(functionName.replaceAll("'", "\\\\'"));
16         sb.append("'](");
17         boolean first = true;
18         for (Object obj : paramArr)
19         {
20             if (!first)
21             {
22                 sb.append(", ");
23             }
24             String jsonStr = SerializeJson(obj);
25             //這裡的jsonStr不需要處理雙引号了,序列化的過程已經處理了内部字元串屬性。其他屬性可以直接生成對象供js調用
26             sb.append(jsonStr);
27 
28             if (first)
29             {
30                 first = false;
31             }
32         }
33         sb.append(")");
34         return sb.toString();
35     }
36 }      

調用參考,C#,java版本的自行了解吧

var paramArr = new Object[] {
        new {//這是個複雜對象
            errcode=0,
            message="MTIzMTIzMTIzMTIzMTIzMTIzMTIzMTIz",//字元串屬性
        },
        "abc",
        1,
        true
    };
    jsHelper.GetCallFunctionString("CallBack", paramArr).Dump();      

生成的文本如下:

javascript:window['CallBack']({"errcode":0,"message":"MTIzMTIzMTIzMTIzMTIzMTIzMTIzMTIz"}, "abc", 1, true)