ctivity Manager遠(yuǎn)程binder調(diào)用接 □ 〇
[0034] 本發(fā)明的有益效果是:
[0035] 本發(fā)明解決了當(dāng)服務(wù)產(chǎn)生事件后,可以主動(dòng)通知所有對(duì)該服務(wù)感興趣的活動(dòng),不 論活動(dòng)和服務(wù)是否處于同一 APP中本發(fā)明提供的服務(wù)到活動(dòng)間的通信機(jī)制,使得服務(wù)和活 動(dòng)間的交互方便、高效、實(shí)時(shí)。
【附圖說(shuō)明】
[0036] 圖1為本發(fā)明監(jiān)聽(tīng)服務(wù)實(shí)施例一的處理流程圖;
[0037] 圖2為本發(fā)明解監(jiān)聽(tīng)實(shí)施例二的處理流程圖;
[0038] 圖3為本發(fā)明實(shí)施例三的原理框圖。
【具體實(shí)施方式】
[0039] 需要說(shuō)明的是,在不沖突的情況下,下述技術(shù)方案,技術(shù)特征之間可以相互組合。
[0040] 下面結(jié)合附圖對(duì)本發(fā)明的【具體實(shí)施方式】作進(jìn)一步的說(shuō)明:
[0041] 實(shí)施例一
[0042] 圖1為本發(fā)明listen service的處理流程圖,本實(shí)施例主要包括兩個(gè)部分: Activity 對(duì) Service 的監(jiān)聽(tīng)(Listen)和解監(jiān)聽(tīng)(Unlisten),Activity 對(duì) Service 的 Listen和Unlisten相當(dāng)于Activity對(duì)于Service的監(jiān)聽(tīng)和解監(jiān)聽(tīng)過(guò)程,只有Listen 了 Service的Activity才能夠接收到Service產(chǎn)生的事件,當(dāng)Activity對(duì)Service的事件不 再感興趣時(shí),貝U解除對(duì)Service的Listen。
[0043] 當(dāng)Service產(chǎn)生事件時(shí),當(dāng)Activity和Service處于同一 APP中時(shí),在對(duì)應(yīng)APP 的主線程(Activity Thread)中構(gòu)建對(duì)應(yīng)的哈希表進(jìn)行管理,這樣不需要經(jīng)過(guò)系統(tǒng)進(jìn)程的 Activity Manager Service,當(dāng)Service有事件產(chǎn)生時(shí),派發(fā)效率更高。相反,當(dāng)Activity 和Service不處于同一 APP時(shí),則通過(guò)IActivityManager遠(yuǎn)程Binder調(diào)用接口進(jìn)入系統(tǒng) 進(jìn)程的Activity Manager Service組件中構(gòu)建Service與Activity之間的哈希表。
[0044] Android系統(tǒng)中所有的Activity均繼承于Activity類,Activity中定義的 Liseten Service/Unlisten Service 函數(shù),分別可以對(duì)應(yīng)調(diào)用 Liseten Service 函數(shù)或是 Unlisten Service函數(shù)來(lái)完成Service的Listen和Unlisten的操作,可以進(jìn)行如下定義:
[0045] public boolean ListenService(String serviceName);
[0046] public boolean UnlistenService(String serviceName);
[0047] 其中的參數(shù)service Name即為對(duì)應(yīng)Service的包名和類名,用來(lái)唯一標(biāo)識(shí) Service。Listen/Unlisten成功后返回true (正確),失敗則返回false (錯(cuò)誤)。
[0048] 如圖1所示,在Activity的Listen Service函數(shù)中,需要從Activity中的 Component (成員)Name的mComponent中得到Activity對(duì)應(yīng)的包名和類名,然后調(diào)用 Activity Thread 的 Listen Service 函數(shù),可以定義如下:
[0049] public boolean Listen Service (String activity Name,String service Name);
[0050] 相比于 Activity 的 Listen Service 函數(shù),此處多了一個(gè)參數(shù):String activity Name,該參數(shù)用來(lái)標(biāo)識(shí)Activity對(duì)應(yīng)的包名和類名。由于APP的主線程Activity Thread負(fù)責(zé)管理對(duì)應(yīng)APP下所有打開(kāi)的Service和Activity,Activity Thread定義 了兩個(gè)哈希表用來(lái)記錄所有打開(kāi)的Service和Activity,HashMap〈IBinder,Activity client record>mActivities 記錄該 APP 下所有打開(kāi)的 Activity,HashMap〈IBinder, Service>mServices記錄該APP下所有打開(kāi)的Service,通過(guò)兩個(gè)參數(shù)activity Name和 service Name即可從兩個(gè)哈希表中通過(guò)匹配包名類名找到對(duì)應(yīng)的實(shí)體,由于Activity是 打開(kāi)的,所以確定可以獲取到對(duì)應(yīng)的活動(dòng)客戶端記錄,如果無(wú)法從mServices哈希表中匹 配Service實(shí)體,說(shuō)明Activity需要Listen的Service處于其他APP總,此時(shí)需要通過(guò) IActivityManager 遠(yuǎn)程 Binder 調(diào)用接口進(jìn)入系統(tǒng)進(jìn)程的 Activity Manager Service 進(jìn) 行處理,在IActivityManager遠(yuǎn)程接口對(duì)應(yīng)的Binder線程中,由于Activity Manager Service 負(fù)責(zé)管理和調(diào)度所有 APP 的 Service 和 Activity,Activity Manager Service 中的Array List〈Activity record>mHistory堆棧數(shù)據(jù)負(fù)責(zé)記錄所有打開(kāi)的Activity, HashMap〈Component Name,service record>mServices 哈希表記錄所有打開(kāi)的 Service,通 過(guò)activity Name和service Name從中就可以匹配到對(duì)應(yīng)的Activity Recored實(shí)體和服 務(wù)記錄實(shí)體,如果服務(wù)記錄實(shí)體不存在,說(shuō)明Activity需要Listen的Service沒(méi)有創(chuàng)建, Listen過(guò)程失敗,如果服務(wù)記錄實(shí)體存在,貝丨】倉(cāng)ij建Activity Manager Service中的服務(wù)記 錄與活動(dòng)記錄實(shí)體之間的哈希表mService Activities。在Activity Thread的Listen Service函數(shù)中如果能夠從mServices哈利表中匹配到Service實(shí)體,貝說(shuō)明Activity和 Service處于同一個(gè)APP中,就創(chuàng)建Activity Thread中的Service與活動(dòng)客戶端記錄實(shí)體 之間的哈希表 mService Activities。
[0051] 實(shí)施例二
[0052] 圖2為本發(fā)明Unlisten service的的處理流程圖,如圖2所示,本實(shí)施例整個(gè)處 理流程同Listen Service類似,此處不再贅述,只是在匹配到了 activity Name和service Name對(duì)應(yīng)的實(shí)體后,需要從Listen Service中創(chuàng)建的哈希表mService Activities中刪除 activity Name(名)和service Name對(duì)應(yīng)實(shí)體的對(duì)應(yīng)項(xiàng)
[0053] 實(shí)施例三
[0054] 圖3為本發(fā)明的原理框圖,當(dāng)Service產(chǎn)生事件后,需要通知到所有Listen該 Service的Activity,由于在應(yīng)用進(jìn)程的Activity Thread中保存了同一 APP下的Listen Activity列表,在系統(tǒng)進(jìn)程的Activity Manager Service中保存了不同APP下的Listen Activity列表,所以派發(fā)過(guò)程需要涉及到應(yīng)用進(jìn)程的Activity Thread和系統(tǒng)進(jìn)程的 Activity Manager Service,如圖 3 所;^,當(dāng) Service 產(chǎn)生事件后,通過(guò) Android(安卓) 系統(tǒng)現(xiàn)有的Intent(目的)數(shù)據(jù)結(jié)構(gòu)將事件打包進(jìn)去,然后調(diào)用Service的事件發(fā)送函數(shù) send Event To Activity,具體定義如下:
[0055] public boolean send Event To Activity (Intent service Event);
[0056] 由于Service中的成員String mClass Name直接標(biāo)識(shí)了 Service的包名和類名, 直接調(diào)用Activity Thread的的send Event To Activity函數(shù),具體定義如下:
[0057] public boolean send Event To Activity(Intent service Event, String service Name);
[0058] 該函數(shù)需要通過(guò)service Name從Activity Thread中的哈希表mService Activities中匹配對(duì)應(yīng)的Service與活動(dòng)客戶端記錄實(shí)體對(duì)應(yīng)項(xiàng),哈希表 mServiceActivities在Listen Service中創(chuàng)建。如果匹配不到對(duì)應(yīng)項(xiàng),說(shuō)明同一個(gè)APP 中沒(méi)有Activity Listen該Service,如果匹配到對(duì)應(yīng)項(xiàng),則保存Service對(duì)應(yīng)的活動(dòng)客戶 端記