服務(wù)至活動間的通信方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及通信領(lǐng)域,尤其涉及一種服務(wù)至活動間的通信方法。
【背景技術(shù)】
[0002] 在Android(安卓)系統(tǒng)中,活動(Activity)負責前臺界面的顯示和管理,月艮 務(wù)(Service)負責沒有界面的相關(guān)功能。當需要使用沒有界面的相關(guān)功能時,通過定 義服務(wù)來完成,服務(wù)運行在主線程,沒有任何界面顯示?;顒涌梢酝ㄟ^Android提供的 startservice (開始服務(wù))函數(shù)來啟動服務(wù),如果服務(wù)已經(jīng)啟動,則通過開始服務(wù)可以傳遞 命令到服務(wù)中,服務(wù)收到該命令后,進行相關(guān)的功能操作。如果活動需要獲取服務(wù)中相關(guān)數(shù) 據(jù),活動可以綁定服務(wù),從而來調(diào)用服務(wù)中提供的接口函數(shù),獲取服務(wù)中相關(guān)信息,調(diào)用服 務(wù)提供的對外接口函數(shù),獲取服務(wù)的相關(guān)數(shù)據(jù)和運行狀態(tài)?;顒犹幱谥鲃拥匚?,服務(wù)處于被 動地位。在服務(wù)的運行過程中,產(chǎn)生相關(guān)事件后,只能保存在服務(wù)實體中,等待活動主動來 獲取相關(guān)事件和數(shù)據(jù)。服務(wù)沒有辦法主動通知對該服務(wù)感興趣的相關(guān)活動?;顒右氆@得 服務(wù)的相關(guān)事件,只能通過不停查詢的方式來調(diào)用服務(wù)提供的接口,效率低下,操作起來繁 瑣,實時性也較差。
【發(fā)明內(nèi)容】
[0003] 由于整個活動與服務(wù)之間的操作過程均是活動主動,而服務(wù)處于被動地位,服務(wù) 完成了某些功能后,需要通過活動管理的界面進行顯示相關(guān)結(jié)果時,需要活動定時去查詢, 導(dǎo)致用戶體驗的效果欠佳。本發(fā)明提供了一套服務(wù)到活動間的通信方法,使得服務(wù)和活動 間的交互方便、高效、實時。
[0004] 本發(fā)明采用如下技術(shù)方案:
[0005] -種service至activity間的通信方法,應(yīng)用于Android系統(tǒng)中,所述通信方法 包括:
[0006] 步驟S1,所述service產(chǎn)生事件;
[0007] 步驟S2,判斷所述activity和待監(jiān)聽的所述service是否處于同一個應(yīng)用中;若 是則執(zhí)行步驟S3,否則直接執(zhí)行步驟S4 ;
[0008] 步驟S3,在所述應(yīng)用的主線程中構(gòu)建service與activity哈希表,所述activity 對所述事件監(jiān)聽對應(yīng)的service ;
[0009] 步驟S4,遠程binder調(diào)用接口,進入activity manager service組件后,匹配已 經(jīng)打開的service列表,建立所述哈希表。
[0010] 對 Service 感興趣的 Activity 需要 Listen (監(jiān)聽)對應(yīng)的 Service,當 Service 產(chǎn)生相關(guān)事件后,通過Listen的Activity列表,將事件傳遞給對應(yīng)的Activity進行處理。 Activity可以調(diào)用Listen Service函數(shù)還Listen對應(yīng)的Service產(chǎn)生的事件,同樣可 以調(diào)用 Unlisten (解監(jiān)聽)Service 函數(shù)解除對 Service 的 Listen。Listen Service 和 Unlisten Service兩個函數(shù)在Activity中實現(xiàn),作為Activity的基本接口函數(shù),每個創(chuàng) 建的Activity均可以調(diào)用。在Listen Service函數(shù)中,首先判斷Activity和要Listen 的Service是否處于同一個APP (應(yīng)用)中,對于處于同一 APP中的Activity和Service, 直接在應(yīng)用的Activity Thread(主線程)構(gòu)建對應(yīng)的哈希表,即一個Service對應(yīng)多個 Activity 的哈希表,一個 Service 可以被多個 Activity 進行 Listen。Activity 和 Service 不處于同一 APP中的情況,貝通過IActivityManager遠程Binder (結(jié)合)調(diào)用接口,進入系 統(tǒng)進程的 Activity Manager (管理)Service 組件,Activity Manager Service 負責管理和 維護所有打開的Service和Activity的生命周期,Activity Manager Service首先會匹配 已經(jīng)打開的Service列表,確定Activity要Listen的Service是否已經(jīng)創(chuàng)建,如果Service 沒有打開,貝U直接返回,如果Service已經(jīng)創(chuàng)建,貝建立該Service與Activity之間的哈希 表,一個Service對應(yīng)多個Activity的哈希表,一個Service可以被多個Activity進行 Listen。
[0011] 優(yōu)選的,步驟S1還包括:
[0012] 步驟S11,于所述步驟S1之后,調(diào)用send Event to activity函數(shù)發(fā)送所述事件 至 listen activity 中。
[0013] 優(yōu)選的,所述步驟S2具體包括:
[0014] 步驟S21,進入service所在應(yīng)用的主線程,查詢與所述事件對應(yīng)的哈希表,判斷 是否在同一所述應(yīng)用中有所述activity在監(jiān)聽所述service^
[0015] 當Service產(chǎn)生事件時,首先會進入Service所在APP的Activity Thread,去 查詢對應(yīng)的Service與Activity的哈希表,如果存在同一 APP中有Activity在Listen 該Service,則發(fā)送消息給Activity Thread,Activity Thread收到該消息后,調(diào)用對應(yīng) Activity的Service事件處理函數(shù)(Receive Service Event)對事件進行處理。同時通過 IActivityManager 遠程 Binder 調(diào)用接口進入系統(tǒng)進程的 Activity Manager Service,查 詢對應(yīng)的Service與Activity的哈希表,確定是否有處于不同APP的Activity在Listen 該Service,然后通過IApplicatinThread遠程Binder調(diào)用接口進入Activity所在APP的 Activity Thread 中,然后調(diào)用 Activity 的 Service事件處理函數(shù)Receive Service Event 對事件進行處理。這樣就完成了 Service到Activity之間的通信過程。
[0016] 優(yōu)選的,所述步驟S2具體包括:
[0017] 步驟S22,獲取活動名(activity name),進入所述主線程的監(jiān)聽服務(wù)(listen service)函數(shù);
[0018] 步驟 S23,調(diào)用 service name ;
[0019] 步驟S24,根據(jù)所述activity name、所述service name獲取活動客戶端記錄 (activity client record)實體和所述 service 實體;
[0020] 步驟S25,判斷所述service name對應(yīng)的所述service實體是否存在。
[0021] 優(yōu)選的,所述步驟S3具體包括:
[0022] 步驟S31,創(chuàng)建所述service實體與所述活動客戶端記錄實體之間的哈希表。
[0023] 優(yōu)選的,所述步驟S4具體包括:
[0024] 步驟S41,進入活動管理服務(wù)(activity manager service)組件后,通過所述服務(wù) 名(service name)判斷是否能夠從所述activity manager service組件中的哈希表中獲 取對應(yīng)的服務(wù)記錄實體,若是則執(zhí)行步驟S42,否則結(jié)束并提示出錯;
[0025] 步驟 S42 :通過所述 activity name 從所述 activity manager service 中獲取對 應(yīng)的活動記錄(activity record)實體,建立所述服務(wù)記錄(service record)實體與所述 活動記錄實體的哈希表。
[0026] 優(yōu)選的,所述通信方法還包括:
[0027] 步驟S5,于所述步驟S4之后,通過所述activity獲取所述activity name,進入 所述主線程的所述listen service函數(shù);
[0028] 步驟 S6,調(diào)用 service name ;
[0029] 步驟S7,通過所述activity name、所述service name獲取活動客戶端記錄實體 和所述service實體;
[0030] 步驟S8,判斷所述service name對應(yīng)的所述service實體是否存在;若是,貝1J刪 除所述service實體與所述活動客戶端記錄實體之間的對應(yīng)項;否則進入所述activity manager service刪除所述服務(wù)記錄實體與所述活動記錄實體之間的對應(yīng)項。
[0031] 優(yōu)選的,所述活動客戶端記錄實體存在于mActivities中和/或所述service實 體存在于mServices中。
[0032] 優(yōu)選的,所述activity name和/或所述service name包括包名和類名。
[0033] 優(yōu)選的,所述步驟S42具體還包括,通過IA