Der Client verwendet WebViewClient
类的shouldOverrideUrlLoading
Methoden, um die Kommunikation zwischen dem Frontend und dem Client abzuwickeln. Woher kennt das Frontend in diesem Fall den Verarbeitungsrückruf des Clients?
Die Situation ist wie folgt:
Das Frontend sendet eine Adresse eines bestimmten Protokolls, z. B. zum Abrufen des aktuellen Benutzersjsbridge://bridge/userid
Der Client erfasst diese Last und beginnt mit der Ausführung von Vorgängen, z. B. dem Schreiben von Werten in das FrontendjavaScript:window.userId=12121
window.location.href = "jsbridge://bridge/userid"
console.log(window.userId) //这样貌似拿不到userId
setTimeout(function() {
console.log(window.userId) //这样就可以拿到了。
}, 1000)
Was sollen wir in diesem Szenario tun?
我的理解,要想弄懂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/...