亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

服務至活動間的通信方法_2

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