Le client utiliseWebViewClient
类的shouldOverrideUrlLoading
méthodes pour gérer la communication entre le frontend et le client. Dans ce cas, comment le front-end connaît-il le rappel de traitement du client ?
La situation est la suivante :
Le front-end envoie une adresse d'un protocole donné, par exemple pour obtenir l'utilisateur actueljsbridge://bridge/userid
Le client capture cette charge et commence à effectuer des opérations, telles que l'écriture de valeurs sur le front-endjavaScript:window.userId=12121
window.location.href = "jsbridge://bridge/userid" console.log(window.userId) //这样貌似拿不到userId setTimeout(function() { console.log(window.userId) //这样就可以拿到了。 }, 1000)
Que devons-nous faire dans ce scénario ?
我的理解,要想弄懂JSBridge,最终需要搞明白三件事,一个是H5如何调用Native,一个是Native如何调用H5,最后一个是两者之间的回调。
H5如何调用Native,网上的的方法殊途同归,就是在WebView加载H5页面的时候会调用
WebChromeClient
或者是WebviewClient
中的方法,选取其中的一个,来截取H5的数据,交由Native处理Native如何调用H5,归根结底就是一条,
webview.loadUrl(javascript:yourFunc(data););
会把数据传给H5并执行H5中的yourFunc
这个方法两者之间的回调,即Native或者H5处理好对方的调用后,把结果返回给对方,供对方使用。本质就是把调用函数Callback使用时间戳或者其他的唯一标识通过Map组织起来,即
Map(UniqueID,Callback)
,并把此唯一标示UniqueID
传给对方函数,对方执行完毕后,会把这个唯一标示UniqueID
和返回数据data
传回来,然后通过这个UniqueID
找到调用函数CallBack
,然后执行CallBack(data)
从你的描述中可以知道,你现在是迷失在第二点上了,你需要在H5中写一个JS方法:
Native中拿到数据后,执行:
webview.loadUrl(javascript:getUseID(userid););
H5中的
getUseID
方法就会被唤起执行了,数据也成功从Native中接收到假如是一个完备的JSBridge,上面的第三点是一定要考虑到的。
你这个是Android Hybrid开发,需要一个JSBridge
给你一个轮子,大头鬼写的:
https://github.com/JerryMissT...
推荐几个Blog,看了还是不错的
http://www.cnblogs.com/dailc/...
http://blog.csdn.net/qq_23547...
http://zjutkz.net/2016/04/17/...