本發(fā)明涉及消息處理領(lǐng)域,尤其涉及一種基于Android系統(tǒng)的消息處理方法及裝置。
背景技術(shù):
:隨著目前Android產(chǎn)品推廣,其友好用戶體驗(yàn),豐富的擴(kuò)展應(yīng)用,以及開源性質(zhì),都是Android系統(tǒng)目前在智能設(shè)備市場(chǎng)占用率上的遙遙領(lǐng)先其他系統(tǒng)的原因。但是隨著Android設(shè)備上安裝的應(yīng)用越來(lái)越多,手機(jī)響應(yīng)速度就會(huì)下降。比如Android系統(tǒng)的消息處理機(jī)制Handler在處理消息隊(duì)列MessageQueue中的消息Message時(shí),是循環(huán)逐一取出Message進(jìn)行處理,然而某些消息在消息隊(duì)列中可能存在多個(gè),并且該消息是相對(duì)獨(dú)立的,而該類消息的處理過(guò)程相對(duì)復(fù)雜且耗時(shí),提高了CPU的占有率,并降低了程序響應(yīng)速度。上述內(nèi)容僅用于輔助理解本發(fā)明的技術(shù)方案,并不代表承認(rèn)上述內(nèi)容是現(xiàn)有技術(shù)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明的主要目的在于提供一種基于Android系統(tǒng)的消息處理方法及裝置,旨在解決CPU的占有率較高,并程序響應(yīng)速度較慢的技術(shù)問(wèn)題。為實(shí)現(xiàn)上述目的,本發(fā)明提供一種基于Android系統(tǒng)的消息處理方法,所述方法包括以下步驟:獲取待處理消息;在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,所述獨(dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息;判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn);否則在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn);從所述鏈表中取出消息進(jìn)行處理。優(yōu)選地,所述判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),具體包括:根據(jù)所述消息類型查找類型記錄表,當(dāng)所述類型記錄表中不存在所述消息類型時(shí),將所述消息類型添加至所述類型記錄表中,并認(rèn)定所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn);當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述從所述鏈表中取出當(dāng)前消息進(jìn)行處理之后,所述方法還包括:將取出的消息作為當(dāng)前消息,判斷所述當(dāng)前消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與所述當(dāng)前消息對(duì)應(yīng)的信息。優(yōu)選地,所述當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)之后,所述方法還包括:從所述類型記錄表中查找與所述消息類型對(duì)應(yīng)的當(dāng)前節(jié)點(diǎn)序號(hào),并根據(jù)所述當(dāng)前節(jié)點(diǎn)序號(hào)獲取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)之后,所述方法還包括:將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中;所述從所述鏈表中取出當(dāng)前消息進(jìn)行處理之后,所述方法還包括:對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整。優(yōu)選地,所述鏈表為單向鏈表;相應(yīng)地,所述在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn),具體包括:在所述鏈表的末尾生成包含所述待處理消息的消息節(jié)點(diǎn)。優(yōu)選地,所述通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),具體包括:將該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。此外,為實(shí)現(xiàn)上述目的,本發(fā)明還提供一種基于Android系統(tǒng)的消息處理裝置,所述裝置包括:消息獲取模塊,用于獲取待處理消息;類型獲取模塊,用于在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,所述獨(dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息;鏈表判斷模塊,用于判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn);否則在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn);消息處理模塊,用于從所述鏈表中取出消息進(jìn)行處理。優(yōu)選地,所述鏈表判斷模塊,還用于根據(jù)所述消息類型查找類型記錄表,當(dāng)所述類型記錄表中不存在所述消息類型時(shí),將所述消息類型添加至所述類型記錄表中,并認(rèn)定所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn);當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述裝置還包括:信息刪除模塊,用于將取出的消息作為當(dāng)前消息,判斷所述當(dāng)前消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與所述當(dāng)前消息對(duì)應(yīng)的信息。優(yōu)選地,所述鏈表判斷模塊,還用于從所述類型記錄表中查找與所述消息類型對(duì)應(yīng)的當(dāng)前節(jié)點(diǎn)序號(hào),并根據(jù)所述當(dāng)前節(jié)點(diǎn)序號(hào)獲取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述鏈表判斷模塊,還用于將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中;所述裝置還包括:序號(hào)調(diào)整模塊,用于對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整。優(yōu)選地,所述鏈表為單向鏈表;相應(yīng)地,所述鏈表判斷模塊,還用于在所述鏈表的末尾生成包含所述待處理消息的消息節(jié)點(diǎn)。優(yōu)選地,所述鏈表判斷模塊,還用于將該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。本發(fā)明在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),否則將所述待處理消息添加至所述鏈表中,從所述鏈表中取出消息進(jìn)行處理,從而在一定程度上減少了需要處理的消息數(shù)量,降低了CPU的占有率,并提高了程序的響應(yīng)速度,并且不影響通用的系統(tǒng)平臺(tái)應(yīng)用的正常運(yùn)行,更具普遍應(yīng)用意義,而且實(shí)現(xiàn)簡(jiǎn)單,部署方便。附圖說(shuō)明圖1為本發(fā)明基于Android系統(tǒng)的消息處理方法第一實(shí)施例的流程示意圖;圖2為本發(fā)明基于Android系統(tǒng)的消息處理方法第二實(shí)施例的流程示意圖;圖3為本發(fā)明基于Android系統(tǒng)的消息處理方法第三實(shí)施例的流程示意圖;圖4為本發(fā)明基于Android系統(tǒng)的消息處理方法第四實(shí)施例的流程示意圖;圖5為本發(fā)明基于Android系統(tǒng)的消息處理裝置第一實(shí)施例的功能模塊示意圖;圖6為本發(fā)明基于Android系統(tǒng)的消息處理裝置第二實(shí)施例的功能模塊示意圖;圖7為本發(fā)明基于Android系統(tǒng)的消息處理裝置第三實(shí)施例的功能模塊示意圖;圖8為本發(fā)明基于Android系統(tǒng)的消息處理裝置第四實(shí)施例的功能模塊示意圖。本發(fā)明目的的實(shí)現(xiàn)、功能特點(diǎn)及優(yōu)點(diǎn)將結(jié)合實(shí)施例,參照附圖做進(jìn)一步說(shuō)明。具體實(shí)施方式應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。參照?qǐng)D1,本發(fā)明第一實(shí)施例提供一種基于Android系統(tǒng)的消息處理方法,所述方法包括:S10:獲取待處理消息;需要說(shuō)明的是,本實(shí)施例的方法的執(zhí)行主體為安裝有Android系統(tǒng)的終端設(shè)備,所述終端設(shè)備可以為智能電視、智能手機(jī)、平板電腦、智能手表、筆記本電腦或掌上電腦等設(shè)備,本實(shí)施例對(duì)此不加以限制。可理解的是,所述待處理消息即為需要處理的消息,現(xiàn)有技術(shù)中,對(duì)于Android系統(tǒng)的消息處理機(jī)制Handler在處理消息隊(duì)列MessageQueue中的消息Message時(shí),是循環(huán)逐一取出Message進(jìn)行處理,相應(yīng)地,本實(shí)施例中,可從所述消息隊(duì)列MessageQueue中依次取出消息Message,并將從所述消息隊(duì)列MessageQueue中取出的消息Message作為待處理消息。S20:在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,所述獨(dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息;在具體實(shí)現(xiàn)中,可預(yù)先在Message類中添加獨(dú)立消息booleanmIndepend變量,當(dāng)handler發(fā)送消息時(shí),如果是獨(dú)立消息,可將該變量置為true(默認(rèn)mIndependent=false),因此,可通過(guò)判斷Message類中變量mIndependent來(lái)確定所述待處理消息是否為獨(dú)立消息。在確定所述待處理消息是否為獨(dú)立消息時(shí),可定義一個(gè)函數(shù)booleanisIndependentMsg(Messagemsg),其功能為判斷待處理消息msg是否為獨(dú)立消息,即判斷Message類中變量mIndependent,該函數(shù)的返回值為:是獨(dú)立消息則返回true,否則返回false??衫斫獾氖?,所述獨(dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息,當(dāng)然,其存在多種消息類型,始終是相同消息類型的最后一條消息起作用,而存在該消息隊(duì)列中其他位置的相同消息類型的消息可被忽略。比如UI進(jìn)度條繪制,如果消息隊(duì)列中存在30個(gè)繪制消息,分別是index=1,2,...30對(duì)應(yīng)的進(jìn)度條,最終體現(xiàn)且起作用的是index=30,那么完全可以忽略index=1,2,3...29,直接繪制index=30的進(jìn)度條。需要說(shuō)明的是,在所述待處理消息不是獨(dú)立消息時(shí),由于其會(huì)對(duì)其他進(jìn)行造成影響,因此,無(wú)需對(duì)該待處理消息的消息類型進(jìn)行判斷,直接將所述待處理消息添加至所述鏈表中。S30:判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn);否則在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn);需要說(shuō)明的是,所述鏈表在使用前通常需要進(jìn)行初始化,故而,本實(shí)施例中,可定義一個(gè)函數(shù)MyLinkListinitLinkList(),其功能為初始化鏈表(所述鏈表用于保存重新排序的節(jié)點(diǎn)),該函數(shù)的作用是返回鏈表??衫斫獾氖?,在判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可定義一個(gè)函數(shù)inthasThisTypeMsg(intmsgWhat,MyLinkListmylinklist),其功能為查詢鏈表mylinklist中是否含有消息類型為msgWhat的消息節(jié)點(diǎn),涉及的參數(shù)msgWhat為所述待處理消息msg的消息類型,參數(shù)mylinklist為所述鏈表,該函數(shù)的返回值為:存在msgWhat消息類型的消息節(jié)點(diǎn),則返回在鏈表中的位置;否則返回-1。在具體實(shí)現(xiàn)中,由于相同消息類型的最后一條消息起作用,而存在該消息隊(duì)列中其他位置的相同消息類型的消息可被忽略,故而,在所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),而在所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)。所述通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),具體包括:將該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。為便于忽略相同消息類型的消息,本實(shí)施例中,在鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可將所述該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)booleanreplaceNode(Messagemsg,MyLinkListmylinklist,intindex),其功能為替換鏈表mylinklist中的第index個(gè)節(jié)點(diǎn)為待處理消息msg,涉及的參數(shù)msg為待處理消息,mylinklist為鏈表,index為替換鏈表中的位置,該函數(shù)的返回值為:成功則返回true,否則返回false。S40:從所述鏈表中取出消息進(jìn)行處理??衫斫獾氖?,本實(shí)施例保留了handler的消息發(fā)送、消息處理順序及處理流程,其盡量保留了Handler_Looper_Msg原生的處理邏輯,但對(duì)Looper的獲取消息機(jī)制進(jìn)行了調(diào)整,也就是說(shuō),對(duì)消息隊(duì)列中的消息逐一取出存入鏈表mylinklist,然后從鏈表mylinklist取出進(jìn)行處理。本實(shí)施例在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),否則將所述待處理消息添加至所述鏈表中,從所述鏈表中取出消息進(jìn)行處理,從而在一定程度上減少了需要處理的消息數(shù)量,降低了CPU的占有率,并提高了程序的響應(yīng)速度,并且不影響通用的系統(tǒng)平臺(tái)應(yīng)用的正常運(yùn)行,更具普遍應(yīng)用意義,而且實(shí)現(xiàn)簡(jiǎn)單,部署方便。參照?qǐng)D2,圖2為本發(fā)明基于Android系統(tǒng)的消息處理方法第二實(shí)施例的流程示意圖,基于上述圖1所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理方法的第二實(shí)施例。本實(shí)施例中,步驟S30’中,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),具體包括:根據(jù)所述消息類型查找類型記錄表,當(dāng)所述類型記錄表中不存在所述消息類型時(shí),將所述消息類型添加至所述類型記錄表中,并認(rèn)定所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn);當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述步驟S40之后,所述方法還包括:S50:將取出的消息作為當(dāng)前消息,判斷所述當(dāng)前消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與所述當(dāng)前消息對(duì)應(yīng)的信息。需要說(shuō)明的是,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),較為常用的方式是將所述鏈表進(jìn)行遍歷,并將遍歷到的消息節(jié)點(diǎn)與所述消息類型進(jìn)行比對(duì),但有時(shí)可能在鏈表中并不存在所述消息類型的情況下,仍然需要對(duì)鏈表進(jìn)行遍歷,也就是說(shuō),浪費(fèi)了遍歷鏈表的時(shí)間,進(jìn)行了無(wú)意義地處理,使得效率降低。為避免上述問(wèn)題,本實(shí)施例中,可維護(hù)一個(gè)類型記錄表,在判斷所述鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可直接查找類型記錄表,在所述類型記錄表中不存在所述消息類型時(shí),直接將所述消息類型添加至所述類型記錄表中,這樣下次獲取的待處理消息仍然是相同消息類型的消息的情況下,即可理解為類型記錄表中存在所述消息類型;在所述類型記錄表中存在所述消息類型時(shí),即可認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)。當(dāng)然,為了保證所述類型記錄表的即時(shí)性,當(dāng)從鏈表中取出當(dāng)前消息進(jìn)行處理時(shí),即可判斷取出的消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與該消息對(duì)應(yīng)的信息,即將所述類型記錄表中與該消息對(duì)應(yīng)的消息類型刪除。參照?qǐng)D3,圖3為本發(fā)明基于Android系統(tǒng)的消息處理方法第三實(shí)施例的流程示意圖,基于上述圖2所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理方法的第三實(shí)施例。本實(shí)施例中,步驟S30”中,當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)之后,所述方法還包括:從所述類型記錄表中查找與所述消息類型對(duì)應(yīng)的當(dāng)前節(jié)點(diǎn)序號(hào),并根據(jù)所述當(dāng)前節(jié)點(diǎn)序號(hào)獲取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,步驟S30”中,在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)之后,所述方法還包括:將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中;所述步驟S40之后,所述方法還包括:S60:對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整??衫斫獾氖牵瑸楸阌讷@取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn),可在所述節(jié)點(diǎn)鏈表中添加與消息類型對(duì)應(yīng)的節(jié)點(diǎn)序號(hào)。當(dāng)然,為了便于在類型記錄表中添加所述節(jié)點(diǎn)序號(hào),本實(shí)施例中,在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)之后,將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中。當(dāng)然,為了保證所述類型記錄表中節(jié)點(diǎn)序號(hào)的即時(shí)性,當(dāng)從鏈表中取出當(dāng)前消息進(jìn)行處理時(shí),對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整,以保證所述類型記錄表中的節(jié)點(diǎn)序號(hào)為最新。參照?qǐng)D4,圖4為本發(fā)明基于Android系統(tǒng)的消息處理方法第四實(shí)施例的流程示意圖,基于上述圖1~3中任一項(xiàng)所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理方法的第四實(shí)施例,圖4以基于圖1所示的實(shí)施例為例。本實(shí)施例中,所述鏈表為單向鏈表;相應(yīng)地,步驟S30”’中,在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn),具體包括:在所述鏈表的末尾生成包含所述待處理消息的消息節(jié)點(diǎn)。在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)booleanaddNode(Messagemsg,MyLinkListmylinklist),其功能為將新節(jié)點(diǎn)(即包含所述待處理消息msg的節(jié)點(diǎn))增加至鏈表mylinklist的末尾,涉及的參數(shù)msg為待處理消息,mylinklist為鏈表,該函數(shù)的返回值為:成功則返回true,否則返回false。為便于保證消息的處理順序,本實(shí)施例中,所述鏈表采用單向鏈表,因此,相應(yīng)地,S40中會(huì)從所述鏈表中依次取出消息進(jìn)行處理,在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)MessagemsggetMsg(intindex,MyLinkListmylinklist),其功能為取出鏈表mylinklist中的第index個(gè)節(jié)點(diǎn)msg,涉及的參數(shù)index為要提取節(jié)點(diǎn)的位置,參數(shù)mylinklist為鏈表,該函數(shù)的返回值為返回與index對(duì)應(yīng)的消息。假設(shè)消息隊(duì)列queue中消息原本的排列為:(設(shè)消息類型相同x1=x2=...=xn)消息4獨(dú)立消息b2消息3獨(dú)立消息a2獨(dú)立消息b1消息2獨(dú)立消息a1消息1鏈表mylinklist中消息的排列為:消息4消息3獨(dú)立消息b2消息2獨(dú)立消息a2消息1可以看到,鏈表中的消息比消息隊(duì)列中的消息少了2條,且因?yàn)檫@2條消息是獨(dú)立消息,因此真正起作用的是處于消息隊(duì)列中最后的一條消息。假設(shè)消息隊(duì)列中如果存在大量的獨(dú)立消息,那本實(shí)施例的方法的優(yōu)點(diǎn)就會(huì)充分發(fā)揮,比如Android6.0,在現(xiàn)有技術(shù)中,當(dāng)用戶按下音量+鍵,AudioService會(huì)利用hanlder發(fā)送音量消息,SystemUi收到消息后進(jìn)行繪制,因?yàn)樵撓⑹仟?dú)立的,如果用戶連續(xù)按下按鍵,當(dāng)松開按鍵后,會(huì)發(fā)現(xiàn)UI會(huì)持續(xù)1-2s才會(huì)停止,原因是消息隊(duì)列queue中消息較多,handler處理不及時(shí)導(dǎo)致,但是如果使用本實(shí)施例的方法,因?yàn)樵撓⑹仟?dú)立消息,當(dāng)用戶停止按鍵后,UI立刻響應(yīng)最后一條消息,并且在用戶停止按鍵后UI不會(huì)繼續(xù)變化,達(dá)到按鍵停,消息處理完的效果。參照?qǐng)D5,本發(fā)明第一實(shí)施例提供一種基于Android系統(tǒng)的消息處理裝置,所述裝置包括:消息獲取模塊10,用于獲取待處理消息;需要說(shuō)明的是,本實(shí)施例的裝置部署于安裝有Android系統(tǒng)的終端設(shè)備上,所述終端設(shè)備可以為智能電視、智能手機(jī)、平板電腦、智能手表、筆記本電腦或掌上電腦等設(shè)備,本實(shí)施例對(duì)此不加以限制??衫斫獾氖?,所述待處理消息即為需要處理的消息,現(xiàn)有技術(shù)中,對(duì)于Android系統(tǒng)的消息處理機(jī)制Handler在處理消息隊(duì)列MessageQueue中的消息Message時(shí),是循環(huán)逐一取出Message進(jìn)行處理,相應(yīng)地,本實(shí)施例中,可從所述消息隊(duì)列MessageQueue中依次取出消息Message,并將從所述消息隊(duì)列MessageQueue中取出的消息Message作為待處理消息。類型獲取模塊20,用于在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,所述獨(dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息;在具體實(shí)現(xiàn)中,可預(yù)先在Message類中添加獨(dú)立消息booleanmIndepend變量,當(dāng)handler發(fā)送消息時(shí),如果是獨(dú)立消息,可將該變量置為true(默認(rèn)mIndependent=false),因此,可通過(guò)判斷Message類中變量mIndependent來(lái)確定所述待處理消息是否為獨(dú)立消息。在確定所述待處理消息是否為獨(dú)立消息時(shí),可定義一個(gè)函數(shù)booleanisIndependentMsg(Messagemsg),其功能為判斷待處理消息msg是否為獨(dú)立消息,即判斷Message類中變量mIndependent,該函數(shù)的返回值為:是獨(dú)立消息則返回true,否則返回false??衫斫獾氖牵霆?dú)立消息為進(jìn)行處理時(shí),不會(huì)對(duì)Android系統(tǒng)中其他進(jìn)程造成影響的消息,當(dāng)然,其存在多種消息類型,始終是相同消息類型的最后一條消息起作用,而存在該消息隊(duì)列中其他位置的相同消息類型的消息可被忽略。比如UI進(jìn)度條繪制,如果消息隊(duì)列中存在30個(gè)繪制消息,分別是index=1,2,...30對(duì)應(yīng)的進(jìn)度條,最終體現(xiàn)且起作用的是index=30,那么完全可以忽略index=1,2,3...29,直接繪制index=30的進(jìn)度條。需要說(shuō)明的是,在所述待處理消息不是獨(dú)立消息時(shí),由于其會(huì)對(duì)其他進(jìn)行造成影響,因此,無(wú)需對(duì)該待處理消息的消息類型進(jìn)行判斷,直接將所述待處理消息添加至所述鏈表中,也就是說(shuō),所述裝置還可包括:消息添加模塊,用于在所述待處理消息不是獨(dú)立消息時(shí),將所述待處理消息添加至所述鏈表中。鏈表判斷模塊30,用于判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn);否則在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn);需要說(shuō)明的是,所述鏈表在使用前通常需要進(jìn)行初始化,故而,本實(shí)施例中,可定義一個(gè)函數(shù)MyLinkListinitLinkList(),其功能為初始化鏈表(所述鏈表用于保存重新排序的節(jié)點(diǎn)),該函數(shù)的作用是返回鏈表。可理解的是,在判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可定義一個(gè)函數(shù)inthasThisTypeMsg(intmsgWhat,MyLinkListmylinklist),其功能為查詢鏈表mylinklist中是否含有消息類型為msgWhat的消息節(jié)點(diǎn),涉及的參數(shù)msgWhat為所述待處理消息msg的消息類型,參數(shù)mylinklist為所述鏈表,該函數(shù)的返回值為:存在msgWhat消息類型的消息節(jié)點(diǎn),則返回在鏈表中的位置;否則返回-1。在具體實(shí)現(xiàn)中,由于相同消息類型的最后一條消息起作用,而存在該消息隊(duì)列中其他位置的相同消息類型的消息可被忽略,故而,在所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),而在所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)。所述通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),具體包括:將該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。為便于忽略相同消息類型的消息,本實(shí)施例中,在鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可將所述該消息節(jié)點(diǎn)中包含的消息替換為所述待處理消息。在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)booleanreplaceNode(Messagemsg,MyLinkListmylinklist,intindex),其功能為替換鏈表mylinklist中的第index個(gè)節(jié)點(diǎn)為待處理消息msg,涉及的參數(shù)msg為待處理消息,mylinklist為鏈表,index為替換鏈表中的位置,該函數(shù)的返回值為:成功則返回true,否則返回false。消息處理模塊40,用于從所述鏈表中取出消息進(jìn)行處理??衫斫獾氖牵緦?shí)施例保留了handler的消息發(fā)送、消息處理順序及處理流程,其盡量保留了Handler_Looper_Msg原生的處理邏輯,但對(duì)Looper的獲取消息機(jī)制進(jìn)行了調(diào)整,也就是說(shuō),對(duì)消息隊(duì)列中的消息逐一取出存入鏈表mylinklist,然后從鏈表mylinklist取出進(jìn)行處理。本實(shí)施例在所述待處理消息是獨(dú)立消息時(shí),獲取所述待處理消息的消息類型,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn),若是,則通過(guò)所述待處理消息更新該消息節(jié)點(diǎn),否則將所述待處理消息添加至所述鏈表中,從所述鏈表中取出消息進(jìn)行處理,從而在一定程度上減少了需要處理的消息數(shù)量,降低了CPU的占有率,并提高了程序的響應(yīng)速度,并且不影響通用的系統(tǒng)平臺(tái)應(yīng)用的正常運(yùn)行,更具普遍應(yīng)用意義,而且實(shí)現(xiàn)簡(jiǎn)單,部署方便。參照?qǐng)D6,圖6為本發(fā)明基于Android系統(tǒng)的消息處理裝置第二實(shí)施例的功能模塊示意圖,基于上述圖5所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理裝置的第二實(shí)施例。本實(shí)施例中,所述鏈表判斷模塊30’,還用于根據(jù)所述消息類型查找類型記錄表,當(dāng)所述類型記錄表中不存在所述消息類型時(shí),將所述消息類型添加至所述類型記錄表中,并認(rèn)定所述鏈表中不存在屬于所述消息類型的消息節(jié)點(diǎn);當(dāng)所述類型記錄表中存在所述消息類型時(shí),認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述裝置還包括:信息刪除模塊50,用于將取出的消息作為當(dāng)前消息,判斷所述當(dāng)前消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與所述當(dāng)前消息對(duì)應(yīng)的信息。需要說(shuō)明的是,判斷鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),較為常用的方式是將所述鏈表進(jìn)行遍歷,并將遍歷到的消息節(jié)點(diǎn)與所述消息類型進(jìn)行比對(duì),但有時(shí)可能在鏈表中并不存在所述消息類型的情況下,仍然需要對(duì)鏈表進(jìn)行遍歷,也就是說(shuō),浪費(fèi)了遍歷鏈表的時(shí)間,進(jìn)行了無(wú)意義地處理,使得效率降低。為避免上述問(wèn)題,本實(shí)施例中,可維護(hù)一個(gè)類型記錄表,在判斷所述鏈表中是否存在屬于所述消息類型的消息節(jié)點(diǎn)時(shí),可直接查找類型記錄表,在所述類型記錄表中不存在所述消息類型時(shí),直接將所述消息類型添加至所述類型記錄表中,這樣下次獲取的待處理消息仍然是相同消息類型的消息的情況下,即可理解為類型記錄表中存在所述消息類型;在所述類型記錄表中存在所述消息類型時(shí),即可認(rèn)定所述鏈表中存在屬于所述消息類型的消息節(jié)點(diǎn)。當(dāng)然,為了保證所述類型記錄表的即時(shí)性,當(dāng)從鏈表中取出當(dāng)前消息進(jìn)行處理時(shí),即可判斷取出的消息是否為獨(dú)立消息,若是,則刪除所述類型記錄表中與該消息對(duì)應(yīng)的信息,即將所述類型記錄表中與該消息對(duì)應(yīng)的消息類型刪除。參照?qǐng)D7,圖7為本發(fā)明基于Android系統(tǒng)的消息處理裝置第三實(shí)施例的功能模塊示意圖,基于上述圖6所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理裝置的第三實(shí)施例。本實(shí)施例中,所述鏈表判斷模塊S30”,還用于從所述類型記錄表中查找與所述消息類型對(duì)應(yīng)的當(dāng)前節(jié)點(diǎn)序號(hào),并根據(jù)所述當(dāng)前節(jié)點(diǎn)序號(hào)獲取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn);相應(yīng)地,所述鏈表判斷模塊S30”,還用于將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中;所述裝置還包括:序號(hào)調(diào)整模塊60,用于對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整??衫斫獾氖?,為便于獲取所述鏈表中屬于所述消息類型的消息節(jié)點(diǎn),可在所述節(jié)點(diǎn)鏈表中添加與消息類型對(duì)應(yīng)的節(jié)點(diǎn)序號(hào)。當(dāng)然,為了便于在類型記錄表中添加所述節(jié)點(diǎn)序號(hào),本實(shí)施例中,在所述鏈表中生成包含所述待處理消息的消息節(jié)點(diǎn)之后,將所述消息類型及生成的消息節(jié)點(diǎn)的節(jié)點(diǎn)序號(hào)添加至所述類型記錄表中。當(dāng)然,為了保證所述類型記錄表中節(jié)點(diǎn)序號(hào)的即時(shí)性,當(dāng)從鏈表中取出當(dāng)前消息進(jìn)行處理時(shí),對(duì)所述類型記錄表中的節(jié)點(diǎn)序號(hào)進(jìn)行調(diào)整,以保證所述類型記錄表中的節(jié)點(diǎn)序號(hào)為最新。參照?qǐng)D8,圖8為本發(fā)明基于Android系統(tǒng)的消息處理裝置第四實(shí)施例的功能模塊示意圖,基于上述圖5~7中任一項(xiàng)所示的實(shí)施例,提出本發(fā)明基于Android系統(tǒng)的消息處理裝置的第四實(shí)施例。本實(shí)施例中,所述鏈表為單向鏈表;相應(yīng)地,所述鏈表判斷模塊30”’,還用于在所述鏈表的末尾生成包含所述待處理消息的消息節(jié)點(diǎn)。在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)booleanaddNode(Messagemsg,MyLinkListmylinklist),其功能為將新節(jié)點(diǎn)(即包含所述待處理消息msg的節(jié)點(diǎn))增加至鏈表mylinklist的末尾,涉及的參數(shù)msg為待處理消息,mylinklist為鏈表,該函數(shù)的返回值為:成功則返回true,否則返回false。為便于保證消息的處理順序,本實(shí)施例中,所述鏈表采用單向鏈表,因此,相應(yīng)地,S40中會(huì)從所述鏈表中依次取出消息進(jìn)行處理,在具體實(shí)現(xiàn)中,可定義一個(gè)函數(shù)MessagemsggetMsg(intindex,MyLinkListmylinklist),其功能為取出鏈表mylinklist中的第index個(gè)節(jié)點(diǎn)msg,涉及的參數(shù)index為要提取節(jié)點(diǎn)的位置,參數(shù)mylinklist為鏈表,該函數(shù)的返回值為返回與index對(duì)應(yīng)的消息。假設(shè)消息隊(duì)列queue中消息原本的排列為:(設(shè)消息類型相同x1=x2=...=xn)消息4獨(dú)立消息b2消息3獨(dú)立消息a2獨(dú)立消息b1消息2獨(dú)立消息a1消息1鏈表mylinklist中消息的排列為:消息4消息3獨(dú)立消息b2消息2獨(dú)立消息a2消息1可以看到,鏈表中的消息比消息隊(duì)列中的消息少了2條,且因?yàn)檫@2條消息是獨(dú)立消息,因此真正起作用的是處于消息隊(duì)列中最后的一條消息。假設(shè)消息隊(duì)列中如果存在大量的獨(dú)立消息,那本實(shí)施例的方法的優(yōu)點(diǎn)就會(huì)充分發(fā)揮,比如Android6.0,在現(xiàn)有技術(shù)中,當(dāng)用戶按下音量+鍵,AudioService會(huì)利用hanlder發(fā)送音量消息,SystemUi收到消息后進(jìn)行繪制,因?yàn)樵撓⑹仟?dú)立的,如果用戶連續(xù)按下按鍵,當(dāng)松開按鍵后,會(huì)發(fā)現(xiàn)UI會(huì)持續(xù)1-2s才會(huì)停止,原因是消息隊(duì)列queue中消息較多,handler處理不及時(shí)導(dǎo)致,但是如果使用本實(shí)施例的方法,因?yàn)樵撓⑹仟?dú)立消息,當(dāng)用戶停止按鍵后,UI立刻響應(yīng)最后一條消息,并且在用戶停止按鍵后UI不會(huì)繼續(xù)變化,達(dá)到按鍵停,消息處理完的效果。需要說(shuō)明的是,在本文中,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者系統(tǒng)不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者系統(tǒng)所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括該要素的過(guò)程、方法、物品或者系統(tǒng)中還存在另外的相同要素。上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到上述實(shí)施例方法可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn),當(dāng)然也可以通過(guò)硬件,但很多情況下前者是更佳的實(shí)施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)(如ROM/RAM、磁碟、光盤)中,包括若干指令用以使得一臺(tái)終端設(shè)備(可以是手機(jī),計(jì)算機(jī),服務(wù)器,空調(diào)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。以上僅為本發(fā)明的優(yōu)選實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說(shuō)明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的
技術(shù)領(lǐng)域:
,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。當(dāng)前第1頁(yè)1 2 3