专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
复利大王  ·  头等舱的空姐 ·  23 小时前  
复利大王  ·  卷麻了!某律所提供“空姐”服务 ·  昨天  
鸿洋  ·  Android×鸿蒙×AI 技术刊#第9期 ... ·  2 天前  
复利大王  ·  北京97师大美女征友 ·  2 天前  
复利大王  ·  复旦大四小迷妹,被交大phd海王pua ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

Android中JS与Java的极简交互库-SimpleJavaJsBridge

安卓开发精选  · 公众号  · android  · 2016-10-10 08:18

正文

请到「今天看啥」查看全文



  • js为java提供一个唯一的接口,这个接口可以是在java端写死的,也可以是js传递过来的(这样更灵活)。所有发送给js的消息(请求消息和反馈消息)都通过该接口

  • java为js提供的一个唯一的接口,因为官方的方法存在漏洞,我们采用在onJsPrompt方法中接收js发送的所有消息,当然大家还可以选择其他方法来接收js的消息,这不是重点。


2.2.2 js与java之间通信协议的制定


js与java之间的通信特别类似于网络请求,主动发起消息的行为可以称为request(请求消息),对该消息的反馈可以称为response(响应消息)。


request


一个request封装了请求对方的哪个接口,以及该接口所需要的参数。


response


一个response封装了状态信息(可以知道处理的结果是成功还是失败)和处理结果。


如何接收对方发送的response消息?


大家都应该都会想到,在发送消息的时候传递一个回调接口就行了,但是因为js与java之间是跨语言的,尤其是java是不可能把回调接口传递给js,js虽然可以传递过来但是会有问题,所以这时候有一种解决办法:


  • 在给对方发送request消息时,为回调接口生成一个唯一的id值,把id值存入request中发出。

  • 同时把回调接口缓存起来。

  • 在接收到response时,从response解析这个id值,根据id值查找到回调接口。


因此request和response中还得包含回调id这个值。


通信协议的格式


request数据格式:


{

//接口名称

"interfaceName" : "test" ,

//回调id值

"callbackId" : "c_111111" ,

//传递的参数

"params" : {

....

}

}


response数据格式:


{

//回调id,同时这也是response的标志

"responseId" : "c_111111" ,

//response数据

"data" : {

//状态数据

"status" : "1" ,

"msg" : "ok" ,

//response的处理结果数据

"values" : {

......

}

}

}


到此通信协议就已经定义好了。


2.2.3 让繁琐的无趣的重复的苦力活儿不再有


大家可以看到通信协议request和response都是json格式,从json中解析数据或者把数据封装为json都是重复的苦力活儿。


这也是我一直想着力解决的痛点,解决之道是从retrofit中获得启发的,应用注解来解决以上问题。


关于js与java完美通信的设计思想到此为止,这也是SimpleJavaJsBridge这个库的核心思想,那我们就来看下SimpleJavaJsBridge。


3. SimpleJavaJsBridge


SimpleJavaJsBridge我为什么要起一个这样的名字,首先它 解决了上文中提到的让繁琐的无趣的重复的苦力活儿 不再有的问题,对于不管是从json中解析数据还是把数据封装成json,使用者都不需要关心,让使用者很省心;并且它使用起来也非常的简单,在稍后的例子中大家会体会到,所以用了simple这个词儿。通过它java可以给js发送消息,并且接收js的响应消息;同时js也可以给java发送消息,同样接收java的响应消息。因此它是java与js之间通信的桥梁,因此它的名字叫为SimpleJavaJsBridge。


3.1 如何解决繁琐的无趣的重复的苦力活儿?


解决这个问题思路来自于鼎鼎有名的Retrofit,Retrofit通过注解的方式解决了构建request和解析response的问题,因此注解也可以解决我现在遇到的问题。那我们就来认识下这些注解。


InvokeJSInterface

用来标注java给js发送消息的方法,它的value值代表js提供的功能的接口名字


JavaCallback4JS

用来标注java提供给js的回调方法的


JavaInterface4JS

用来标注java提供给js的接口,它的value值代表功能的接口名字


Param

用来标注参数或者类的实例属性,它的value值代表参数被存入json中的key值,它的needConvert代表当前的参数是否需要进行转换,因为通过JsonObject类往json中存放的数据是有要求的,JsonObject中只能存放基本数据和JsonObject和JsonArray这些数据类型,对于其他的类型就得进行转换了。因此只要是不能直接通过JsonObject存放的类型该值必须为true


ParamCallback

用来标注回调类型的参数,比如发送request给js的方法中,需要有一个回调参数,那这个参数必须用它来标注


ParamResponseStatus

用来标注响应状态类型的参数,比如:statusCode,StatusMsg这些参数,它的value值是json中的key值。


3.2 SimpleJavaJsBridge使用


3.2.1 构建一个SimpleJavaJsBridge实例


SimpleJavaJsBridge instance = new SimpleJavaJsBridge . Builder ()

. addJavaInterface4JS ( javaInterfaces4JS )

. setWebView ( webView )

. setJSMethodName4Java ( "_JSBridge._handleMessageFromNative" )

. setProtocol ( "niu" , "receive_msg" ). create ();


通过SimpleJavaJsBridge.Builder来构建一个SimpleJavaJsBridge对象,


  • addJavaInterface4JS用来添加java提供给js的接口

  • setWebView 设置WebView这是必须进行设置的

  • setJSMethodName4Java 设置js为java唯一暴漏的方法名字

  • setProtocol设置协议字段,这也是必须的,这个字段主要是为了ios而设置的


当然还可以调用其他的一些方法对SimpleJavaJsBridge进行设置


3.2.2 java给js提供接口


java给js提供一个无参的接口


/** * 给js发送响应消息的接口*/

public interface IResponseStatusCallback {

void callbackResponse (@ ParamResponseStatus ( "status" ) int status , @ ParamResponseStatus ( "msg" ) String msg );

}

//java提供给js的"tes4"接口,@ParamCallback标注的是给js发送消息的回调







请到「今天看啥」查看全文