上一篇筆者簡要分析了Cordova從JS端->Native端的調用過程(以JS Object橋為例)。本章讓我們來分析下這個過程的反面,也就是從Native端->JS端,Cordova是如何處理的。
老習慣,我們先看一段代碼:
exec.jsnativeToJsModes = {
// Polls for messages using the JS->Native bridge.
POLLING: 0,
// For LOAD_URL to be viable, it would need to have a work-around for
// the bug where the soft-keyboard gets dismissed when a message is sent.
LOAD_URL: 1,
// For the ONLINE_EVENT to be viable, it would need to intercept all event
// listeners (both through addEventListener and window.ononline) as well
// as set the navigator property itself.
ONLINE_EVENT: 2
}
可以看到Cordova實現了3中模式:POLLING、LOAD_URL和ONLINE_EVENT。筆者這里重點分析了第一種,也就是POLLING模式,后兩種有機會再做深入研究。下圖大致描述了這個過程。
總體來說,過程如下:
1、JS端調用Native API后,如果當前調用消息未處理完成,每隔50ms取一次消息隊列,直到本次調用的消息結束;
2、Native端的插件同樣維護了一個消息隊列;
3、JS端通過Native端暴露的retrieveMessages接口來實現消息的拉取;
另外,通過源代碼我們可以大致分析下Cordova的JS和Native兩端的消息格式大致協議:
1、* 號的消息表示當前Native端仍然有待處理消息,JS端會再拉取一次消息;
2、消息內容的第一個字符如果為S表示調用成功,F表示調用失敗;
其他的有興趣的可以對照代碼再做分析。