安卓调用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)

 

posted @ 2021-05-11 18:36  shamork  阅读(172)  评论(0编辑  收藏  举报