簡(jiǎn)述
EventBus是事件總線(xiàn)播聪,用來(lái)處理一些事件及時(shí)通知的氮双,用來(lái)處理UI或數(shù)據(jù)。
但是是單進(jìn)程的胀滚,不能跨進(jìn)程咳短;說(shuō)到跨進(jìn)程就避不開(kāi)binder通信。
Hermes就是快進(jìn)程版本的EventBus蛛淋;如果了解Binder的話(huà)那理解起來(lái)應(yīng)該很簡(jiǎn)單咙好,就是基本思路不變,然后在這個(gè)基礎(chǔ)上通過(guò)binder通信褐荷。
Hermes是出于一個(gè)單例類(lèi)來(lái)做整體處理的勾效,通知也是調(diào)用這個(gè)單例類(lèi)的某個(gè)方法,然后在方法中怎么通知到具體的東西叛甫,你就可以繼續(xù)按照EventBus的思想繼續(xù)操作了层宫。
說(shuō)一下“破解版”的思路。
看視頻課講解其监,沒(méi)有自己去扒一遍萌腿;整理了一下思路和方案邏輯,覺(jué)得講的思路是完全行得通的抖苦。
在A進(jìn)程中注冊(cè)一個(gè)單例類(lèi)(用接口的方式)毁菱,搜集類(lèi)的全限定名米死,以及對(duì)應(yīng)的所有方法,放到集合中緩存贮庞。
然后在B進(jìn)程中峦筒,通過(guò)aidl來(lái)綁定A進(jìn)程中的Service,這樣就有了跨進(jìn)程通信的能力窗慎。
然后在B進(jìn)程中拿到A進(jìn)程中的單例物喷,把單例對(duì)應(yīng)的類(lèi)的全限定名和方法名binder發(fā)過(guò)去;A進(jìn)程中收到后解析對(duì)應(yīng)的類(lèi)的全限定名和方法遮斥,然后反射執(zhí)行獲取單例峦失,然后將單例對(duì)象保存在A進(jìn)程中的一個(gè)集合中。
然后在B進(jìn)程通過(guò)動(dòng)態(tài)代理的方式生成一個(gè)新的對(duì)象給B持有术吗;這時(shí)B就可以調(diào)用A中單例的某個(gè)方法了宠进。(這里的動(dòng)態(tài)代理就是個(gè)假動(dòng)作,并沒(méi)有發(fā)揮出動(dòng)態(tài)代理的作用藐翎,就只是生成個(gè)句柄供B調(diào)用某個(gè)單例方法的時(shí)候方便材蹬;其實(shí)可以寫(xiě)個(gè)方法,里面就放類(lèi)的全限定名吝镣,然后放方法名以及參數(shù)也是可以的)
此時(shí)B中調(diào)用A中單例的某個(gè)方法堤器,參數(shù)啥的都帶上,binder發(fā)過(guò)去末贾;A中收到后解析出對(duì)應(yīng)的類(lèi)的全限定名和方法名闸溃,之前集合中存儲(chǔ)了單例類(lèi)的對(duì)象,于是可以直接反射執(zhí)行該方法拱撵。
至于如何在這個(gè)單例方法中去響應(yīng)類(lèi)似EventBus的作用辉川,在Activity/Fragemnt中響應(yīng)更新UI或者數(shù)據(jù),可以再撿起EventBus中的那一套拴测,也用集合去緩存所有的注解方法乓旗,然后反射執(zhí)行對(duì)應(yīng)的方法,只不過(guò)是多了一層中轉(zhuǎn)集索。
等完成自己的規(guī)劃屿愚,再去扒一邊,看是不是差不多务荆,順帶看看細(xì)節(jié)妆距。