一種Android系統(tǒng)中View間的通信方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信的技術(shù)領(lǐng)域,特別是涉及一種Android系統(tǒng)中的View間的通信方法。
【背景技術(shù)】
[0002]Android系統(tǒng)中,View組件負(fù)責(zé)顯示和觸屏?xí)r間的處理,對(duì)于屏幕的點(diǎn)擊事件也是由View來(lái)進(jìn)行處理。作為View容器的Activity對(duì)View進(jìn)行管理,負(fù)責(zé)View的布局以及創(chuàng)建移除等生命周期相關(guān)操作。當(dāng)Activity/Service/Broadcast等組件收到相關(guān)驅(qū)動(dòng)消息后,會(huì)更新View的顯示。
[0003]在界面運(yùn)行過程中,由用戶點(diǎn)擊或各種系統(tǒng)狀態(tài)變化導(dǎo)致View的顯示狀態(tài)出現(xiàn)變化,View需要告知管理者Activity,以便Activity進(jìn)行相關(guān)處理。為此,Android系統(tǒng)為View組件定義了一組回調(diào)函數(shù),在View創(chuàng)建后,Activity可以設(shè)置這些回調(diào)函數(shù)。如圖1所示,為了達(dá)到很好的顯示效果,當(dāng)界面中一個(gè)View的相關(guān)狀態(tài)發(fā)生變化時(shí),很多時(shí)候需要其他View的顯示狀態(tài)也發(fā)生變化。為了完成這種效果,就需要Activity設(shè)置View的回調(diào)函數(shù)。當(dāng)View狀態(tài)發(fā)生變化時(shí),調(diào)用Activity設(shè)置的回調(diào)函數(shù),然后Activity根據(jù)當(dāng)前情況,調(diào)用其他View的接口函數(shù),更新其他View的相關(guān)狀態(tài)。
[0004]然而,上述方法具有以下不足:
[0005](I)沒有提供View與View之間的直接的交互通道,單個(gè)View只能與所在的Activity進(jìn)行交互,然后再由Activity去與其他View進(jìn)行交互,使得整個(gè)過程都需要Activity進(jìn)行控制,增加了 Activity的復(fù)雜度;
[0006](2)很多Activity對(duì)于View的操作是相同的,每個(gè)Activity都需要把對(duì)應(yīng)的操作重新實(shí)現(xiàn)一遍,增加了 Activity的冗余度。
[0007]因此,如果能建立其View與View之間的通信通道,那么就不需要經(jīng)過Activity進(jìn)行中轉(zhuǎn)操作,導(dǎo)致Activity復(fù)雜度和冗余度增加,并且還可以增強(qiáng)View的功能開發(fā)和擴(kuò)展。但是,現(xiàn)有的技術(shù)并不支持View與View之間的通信機(jī)制,完全保持View和View之間的隔離。因此,如何提供了 View之間的通信交互機(jī)制,成為當(dāng)下一個(gè)熱點(diǎn)研究課題。
【發(fā)明內(nèi)容】
[0008]鑒于以上所述現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明的目的在于提供一種Android系統(tǒng)中的View間的通信方法,通過View消息ID來(lái)區(qū)分View之間需要進(jìn)行的操作,采取Handler線程來(lái)對(duì)消息進(jìn)行管理和派發(fā),不影響Android UI線程的運(yùn)行,Activity可以根據(jù)當(dāng)前運(yùn)行情況對(duì)View消息進(jìn)行處理和攔截,從而在減輕Activity的復(fù)雜度和冗余度的基礎(chǔ)上,還可以豐富View的功能開發(fā)和擴(kuò)展,并且不影響Activity對(duì)于View的控制。
[0009]為實(shí)現(xiàn)上述目的及其他相關(guān)目的,本發(fā)明提供一種Android系統(tǒng)中的View間的通信方法,包括I)定義與View相對(duì)應(yīng)的View消息ID,采用View消息ID附帶相關(guān)數(shù)據(jù)的方式構(gòu)造View消息;2)建立View消息和View實(shí)體的相對(duì)應(yīng)的哈希表,實(shí)現(xiàn)View中的View消息的注冊(cè);當(dāng)View從界面中移除時(shí),從哈希表中注銷該View所注冊(cè)的所有View消息;3)創(chuàng)建處理線程,并采用處理線程對(duì)View消息進(jìn)行處理。
[0010]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述相關(guān)數(shù)據(jù)包括View狀態(tài)變化信息。
[0011 ] 根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述View消息ID采用int類型。
[0012]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述View消息對(duì)應(yīng)的數(shù)據(jù)包采用Android系統(tǒng)的Intent數(shù)據(jù)結(jié)構(gòu)。
[0013]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述2)中,實(shí)現(xiàn)View中的View消息的注冊(cè)包括以下步驟:
[0014]步驟S31、從View的View消息列表中依次讀取一個(gè)View消息;
[0015]步驟S32、判斷讀取的View消息是否為空;若是,注冊(cè)完成,流程結(jié)束;若否,轉(zhuǎn)入步驟S33 ;
[0016]步驟S33、根據(jù)View消息ID搜索View消息所注冊(cè)的哈希表;
[0017]步驟S34、判斷是否有其他View注冊(cè)過該View消息;若是,轉(zhuǎn)入步驟S35 ;若否,轉(zhuǎn)入步驟S36 ;
[0018]步驟S35、直接將View添加到哈希表中該View消息所對(duì)應(yīng)的View列表中,并轉(zhuǎn)入步驟S31 ;
[0019]步驟S36、在哈希表中創(chuàng)建View消息ID和相對(duì)應(yīng)的View列表;
[0020]步驟S37、將View添加到哈希表中新建的View列表中,并轉(zhuǎn)入步驟S31。
[0021]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述2)中,從哈希表中注銷該View所注冊(cè)的View消息包括以下步驟:
[0022]步驟S41、從View的View消息列表中依次讀取一個(gè)View消息;
[0023]步驟S42、判斷讀取的View消息是否為空;若是,注銷完成,流程結(jié)束;若否,轉(zhuǎn)入步驟S43 ;
[0024]步驟S43、根據(jù)View消息ID搜索View消息所注冊(cè)的哈希表;
[0025]步驟S44、從哈希表中讀取該View消息所對(duì)應(yīng)的View列表;
[0026]步驟S45、從該View列表中刪除需要注銷的View,轉(zhuǎn)入步驟S41。
[0027]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述處理線程采取View消息驅(qū)動(dòng)方式,當(dāng)View的狀態(tài)發(fā)生變化并發(fā)出View消息時(shí),所述處理線程開始運(yùn)行。
[0028]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述3)中,所述處理線程包括以下步驟:
[0029]步驟S51、從View消息列表中讀取View消息ID ;
[0030]步驟S52、將該View消息轉(zhuǎn)發(fā)給Acitivity進(jìn)行預(yù)處理;
[0031]步驟S53、若Activity不允許處理該View消息,不執(zhí)行任何操作,流程結(jié)束;否則轉(zhuǎn)入步驟S54 ;
[0032]步驟S54、根據(jù)View消息ID搜索View消息所注冊(cè)的哈希表;
[0033]步驟S55、判斷是否有View注冊(cè)過該View消息;若否,不執(zhí)行任何操作,流程結(jié)束;否則轉(zhuǎn)入步驟S56 ;
[0034]步驟S56、讀取View消息所對(duì)應(yīng)的View列表;
[0035]步驟S57、依次調(diào)用每個(gè)View實(shí)體對(duì)應(yīng)的View消息處理函數(shù)。
[0036]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:若沒有接收到View消息,所述處理線程進(jìn)入睡眠狀態(tài)。
[0037]根據(jù)上述的Android系統(tǒng)中的View間的通信方法,其中:所述View消息統(tǒng)一定義在Android系統(tǒng)的Intent, java文件中。
[0038]如上所述,本發(fā)明的Android系統(tǒng)中的View間的通信方法,具有以下有益效果:
[0039](I)減輕了 Activity的復(fù)雜度和冗余度;
[0040](2)有效增強(qiáng)了 View的功能開發(fā)和擴(kuò)展;
[0041 ] (3)不影響Activity對(duì)于View的控制。
【附圖說明】
[0042]圖1顯示為現(xiàn)有技術(shù)中的通過Activity實(shí)現(xiàn)View間通信的示意圖;
[0043]圖2顯示為本發(fā)明的Android系統(tǒng)中的View間的通信方法的示意圖;
[0044]圖3顯示為本發(fā)明的View Message的注冊(cè)流程圖;
[0045]圖4顯示為本發(fā)明的View Message的注銷流程圖;
[0046]圖5顯示為本發(fā)明的Handler線程的處理流程圖。
【具體實(shí)施方式】
[0047]以下通過特定的具體實(shí)例說明本發(fā)明的實(shí)施方式,本領(lǐng)域技術(shù)人員可由本說明書所揭露的內(nèi)容輕易地了解本發(fā)明的其他優(yōu)點(diǎn)與功效。本發(fā)明還可以通過另外不同的【具體實(shí)施方式】加以實(shí)施或應(yīng)用,本說明書中的各項(xiàng)細(xì)節(jié)也可以基于不同觀點(diǎn)與應(yīng)用,在沒有背離本發(fā)明的精神下進(jìn)行各種修飾或改變。
[0048]需要說明的是,本實(shí)施例中所提供的圖示僅以示意方式說明本發(fā)明的基本構(gòu)想,遂圖式中僅顯示與本發(fā)明中有關(guān)的組件而非按照實(shí)際實(shí)施時(shí)的組件數(shù)目、形狀及尺寸繪制,其實(shí)際實(shí)施時(shí)各組件的型態(tài)、數(shù)量及比例可為一種隨意的改變,且其組件布局型態(tài)也可能更為復(fù)雜。
[0049]為了建立View之間的交互通道,如圖2所示,本發(fā)明的Android系統(tǒng)中的View間的通信方法中,首先需要定義一組View對(duì)應(yīng)的View消息ID(View Message ID),View消息(View Message)對(duì)應(yīng)的數(shù)據(jù)包采用Android系統(tǒng)的Intent數(shù)據(jù)結(jié)構(gòu),這樣不需要重新定義新的數(shù)據(jù)結(jié)構(gòu)。在ActiVity創(chuàng)建后,需要建立一個(gè)哈希表,用于View Message與View實(shí)體之間的對(duì)應(yīng);然后創(chuàng)建Handler線程,用來(lái)對(duì)View Message進(jìn)行處理。當(dāng)View創(chuàng)建后,添加到界面中,需要向Android系統(tǒng)注冊(cè)View需要處理的View Message列表,系統(tǒng)收到注冊(cè)請(qǐng)求后,將View Message與注冊(cè)了該View Message的View實(shí)體添加到哈希表中。當(dāng)View從界面中移除時(shí),需要向Android系統(tǒng)注銷該View實(shí)體所注冊(cè)過的全部View Message ;Android系統(tǒng)收到注銷請(qǐng)求后,遍歷哈希表,將各個(gè)View Message對(duì)應(yīng)的View實(shí)體從哈希表中刪除。當(dāng)View的狀態(tài)發(fā)生變化時(shí),發(fā)送對(duì)應(yīng)的View Message給Handler線程,Handler線程收到該View Message后,首先轉(zhuǎn)交給所在的Activity進(jìn)行預(yù)處理,之后在Activity允許的情況下,從哈希表中找到該View Message對(duì)應(yīng)的View列表,然后調(diào)用各個(gè)View實(shí)體對(duì)應(yīng)的View Message處理函數(shù),從而完成View與View之間的交互通信。
[0050]具體地,本發(fā)明的Android系統(tǒng)中的View間的通信方法包括:
[0051](I)定義與View相對(duì)應(yīng)的View Message ID,米用View Message ID附帶相關(guān)數(shù)據(jù)的方式來(lái)構(gòu)造View Message。
[0052]具體地,View之間的通信交互通過View Message ID來(lái)進(jìn)行,不管是Android系統(tǒng)自帶的View還是后續(xù)開發(fā)的View。每個(gè)View的狀態(tài)變化需要通知其他View時(shí),都需要預(yù)先定一個(gè)View Message ID,并將View Message ID附帶相關(guān)數(shù)據(jù)形式的View Message發(fā)送給Andro i d系統(tǒng)。其中,相關(guān)數(shù)據(jù)包括Vi ew狀態(tài)變化信息。
[0053]View Message ID采用int類型,完全可以滿足View Message數(shù)目上的需求。由于每個(gè)View Message均有可能附帶相關(guān)數(shù)據(jù),采用Android系統(tǒng)的Intent數(shù)據(jù)結(jié)構(gòu)作為數(shù)據(jù)打包結(jié)構(gòu),無(wú)需重新定義新的數(shù)據(jù)結(jié)構(gòu),View Message也統(tǒng)一定義在Android系統(tǒng)的Intent, java文件中,方便View Message ID和相關(guān)數(shù)據(jù)一起訪問。
[0054]以MyView為例,具體View Message ID定義不例如下:
[0055]//當(dāng)MyView的顯示內(nèi)容發(fā)生變化時(shí)拋出該消息
[0056]public static final int MYVIEff_CHANGE_TEXT_MESSAGE = 0x00000001 ;
[0057]//當(dāng)MyView的顯示顏色發(fā)生變化時(shí)拋出該消息
[0058]public static final int MYVIEff_CHANGE_COLOR_MESSAGE = 0x00000002 ;
[0059]......................................................................................