解本發(fā)明,首先介紹android的狀態(tài)欄實(shí)現(xiàn)原理及架構(gòu)。
[0037]本領(lǐng)域技術(shù)人員理解,整個(gè)android框架的基礎(chǔ)是運(yùn)行在system server (系統(tǒng)服務(wù))進(jìn)程中的服務(wù)。其中,Notificat1nManagerService (通知管理服務(wù))和Notificat1nManager (通知管理)是負(fù)責(zé)管理和通知后臺(tái)事件的服務(wù),也就是實(shí)現(xiàn)狀態(tài)欄通知的服務(wù)。發(fā)送一個(gè)狀態(tài)欄通知必須用到兩個(gè)類=Notificat1nManager和Notificat1n(通知)。其中,Notificat1nManager是狀態(tài)欄通知的管理類,負(fù)責(zé)發(fā)通知、清除通知等。Notificat1nManager是一個(gè)系統(tǒng)Service (服務(wù)),必須通過getSystemService O方法來獲取。Notificat1n是具體的狀態(tài)欄通知對象,可以設(shè)置icon(圖標(biāo)格式)、文字、提示聲音、振動(dòng)等參數(shù)。例如,設(shè)置一個(gè)通知需要的基本參數(shù)包括:An icon (通知的圖標(biāo));A title and expanded message (通知的標(biāo)題和內(nèi)容);APendingIntent (點(diǎn)擊通知執(zhí)行頁面跳轉(zhuǎn));可選的參數(shù)包括:A ticker-text message (狀態(tài)欄頂部提示消息);An alert sound (提示音);A vibrate setting (振動(dòng));A flashingLED setting (燈光)。
[0038]創(chuàng)建和顯示一個(gè)Notificat1n需要如下5步:
[0039]1.通過 getSystemService 方法獲得一個(gè) Notificat1nManager 對象。
[0040]2.創(chuàng)建一個(gè) Notif icat1n 對象。每一個(gè) Notif icat1n 對應(yīng)一個(gè) Notif icat1n對象。在這一步需要設(shè)置顯示在屏幕上方狀態(tài)欄的通知消息、通知消息前方的圖像資源ID和發(fā)出通知的時(shí)間。
[0041]3.由于Notificat1n可以與應(yīng)用程序脫離。也就是說,即使應(yīng)用程序被關(guān)閉,Notificat1n仍然會(huì)顯示在狀態(tài)欄中。當(dāng)應(yīng)用程序再次啟動(dòng)后,又可以重新控制這些Notificat1n。如清除或替換它們。因此,需要?jiǎng)?chuàng)建一個(gè)PendingIntent對象。該對象由Android系統(tǒng)負(fù)責(zé)維護(hù),因此,在應(yīng)用程序關(guān)閉后,該對象仍然不會(huì)被釋放。
[0042]4.使用 Notificat1n 類的 setLatestEventlnfo 方法設(shè)置 Notificat1n 的詳細(xì)信息。
[0043]5.使用 Notif icat1nManager 類的 notify 方法顯不 Notif icat1n 消息。在這一步需要指定標(biāo)識(shí)Notificat1n的唯一 ID。
[0044]參見圖1,為狀態(tài)欄實(shí)現(xiàn)架構(gòu)示意圖。首先,app層的應(yīng)用程序通過Notificat1nManager.notify 方法向 framework 層的 Notificat1nManagerService發(fā)送狀態(tài)欄通知;然后,在Notificat1nManagerService中,將應(yīng)用程序發(fā)送的狀態(tài)欄通知條目保存在列表中;最后,Notificat1nManagerService通過StatusBar.addNotif icat1n O方法向系統(tǒng)狀態(tài)欄所在的SystemUi (系統(tǒng)用戶界面)進(jìn)程發(fā)送顯示狀態(tài)欄通知,這樣應(yīng)用程序發(fā)送的狀態(tài)欄通知就會(huì)在系統(tǒng)狀態(tài)欄中顯示出來了。圖1中,僅在app層以一個(gè)應(yīng)用程序?yàn)槔?,可以理解,以手機(jī)為例,可包括多個(gè)應(yīng)用程序要顯示狀態(tài)欄通知。
[0045]通過圖1可知,從app創(chuàng)建一個(gè)通知到將該通知顯示在系統(tǒng)狀態(tài)欄中,需要framework 層的 system_server 進(jìn)程中的 Notificat1nManagerService 的處理和中轉(zhuǎn),最終由SystemUi負(fù)責(zé)顯示。本發(fā)明中,通過android注入技術(shù),在framework層中增加與app層狀態(tài)欄管理器對應(yīng)的狀態(tài)欄接管服務(wù),相當(dāng)于在system_server進(jìn)程中運(yùn)行特定的代碼,繼而替換向SyStemUi發(fā)送命令的句柄,從而可以選擇性阻斷Notificat1nManagerService向sytemUi進(jìn)程發(fā)送狀態(tài)欄顯示命令,達(dá)到接管狀態(tài)欄的目的。
[0046]參見圖2,為本發(fā)明實(shí)施例提供的狀態(tài)欄通知的接管系統(tǒng)架構(gòu)示意圖。
[0047]狀態(tài)欄通知接管實(shí)現(xiàn)分為兩大部分。第一部分是在framework層增加的狀態(tài)欄接管服務(wù),運(yùn)行在system_server進(jìn)程中,用于根據(jù)預(yù)設(shè)條件過濾狀態(tài)欄通知條目,從而僅在系統(tǒng)狀態(tài)欄顯示過濾之后的狀態(tài)欄通知。也就是,通過代碼注入方式,狀態(tài)欄接管服務(wù)檢測到system server進(jìn)程調(diào)用狀態(tài)欄通知顯示命令的接口(API),由狀態(tài)欄接管服務(wù)調(diào)用該接口,從而向SystemUi進(jìn)程發(fā)送狀態(tài)欄通知顯示命令,僅顯示滿足過濾條件的狀態(tài)欄通知。第二部分是運(yùn)行在app層的狀態(tài)欄管理器,通過調(diào)用Notificat1nManagerService,例如通過 GetAllNotificat1ns 方法調(diào)用 Notificat1nManagerService,可供用于查看所有當(dāng)前狀態(tài)欄通知列表,包括在系統(tǒng)狀態(tài)欄中被隱藏的狀態(tài)欄通知條目。可以理解,狀態(tài)欄接管服務(wù)和狀態(tài)欄管理器是對應(yīng)的,可以理解狀態(tài)欄接管的后臺(tái)部分和用戶界面部分,二者協(xié)同運(yùn)行。一方面,狀態(tài)欄管理器確定狀態(tài)欄通知的過濾條件,將過濾條件提供給狀態(tài)欄接管服務(wù);另一方面,狀態(tài)欄管理器調(diào)用systenuserver進(jìn)程中的Notificat1nManagerService,從而獲耳又并顯不 Notificat1nManagerService 保存的列表中的所有狀態(tài)欄通知。其中,狀態(tài)欄管理器可以理解為一個(gè)應(yīng)用程序?qū)崿F(xiàn)的功能,例如360安全衛(wèi)士中的一個(gè)功能。
[0048]其中,在上述第一部分的狀態(tài)欄接管服務(wù)中,涉及根據(jù)預(yù)先設(shè)置的過濾條件對通知條目進(jìn)行過濾,從而可以選擇性的只接管某些(個(gè))應(yīng)用程序的狀態(tài)欄通知。具體的,app層的狀態(tài)欄管理器可以向用戶提供設(shè)置過濾條件的界面,并且在用戶設(shè)置完成后提供給狀態(tài)欄接管服務(wù)。例如,用戶可以選擇某些IM(即時(shí)通訊)軟件、網(wǎng)銀類軟件設(shè)為屬于白名單的應(yīng)用程序,這些應(yīng)用程序的狀態(tài)欄通知還是可以正常發(fā)送到系統(tǒng)狀態(tài)欄。用戶也可以選擇某些軟件為屬于黑名單的應(yīng)用程序,這些黑名單的應(yīng)用程序的狀態(tài)欄通知就不會(huì)發(fā)送到系統(tǒng)狀態(tài)欄上了。當(dāng)然,用戶還可以采用白名單和黑名單結(jié)合的方式。其中,應(yīng)用程序的白名單或者應(yīng)用程序的黑名單可以由狀態(tài)欄管理器預(yù)先獲取并提供給用戶,以便用戶在設(shè)置過濾條件時(shí)參考。例如,通過云端服務(wù)器配置黑名單或者白名單的方式,獲取到應(yīng)用程序的白名單或者應(yīng)用程序的黑名單。由于云端方案基于大量的樣本運(yùn)營和人工智能方法,包括沙箱、靜態(tài)代碼分析,動(dòng)態(tài)代碼特征掃描等方式,因此具有樣本大而較為精準(zhǔn)的優(yōu)點(diǎn)。當(dāng)然,也可以直接采用狀態(tài)欄管理器默認(rèn)的白名單或/和黑名單,而無需用戶設(shè)置。
[0049]參見圖3,為本發(fā)明實(shí)施例提供的一種狀態(tài)欄通知的接管方法的流程圖。其中,在操作系統(tǒng)的系統(tǒng)框架層(framework層)中設(shè)置與應(yīng)用程序?qū)?app層)中的狀態(tài)欄管理器相對應(yīng)的狀態(tài)欄接管服務(wù),該方法包括:
[0050]S301:在狀態(tài)欄管理器中確定針對應(yīng)用程序的狀態(tài)欄通知的過濾條件;
[0051]如前所介紹的,狀態(tài)欄管理器可以向用戶提供設(shè)置界面,由用戶設(shè)置過濾條件,例如,設(shè)置允許顯示某一些應(yīng)用程序的狀態(tài)欄通知,以及,設(shè)置禁止顯示另一些應(yīng)用程序的狀態(tài)欄通知。在具體實(shí)現(xiàn)時(shí),可結(jié)合預(yù)先獲取的應(yīng)用程序白名單,允許顯示應(yīng)用程序白名單中應(yīng)用程序的狀態(tài)欄通知。同理,還可結(jié)合預(yù)先獲取的應(yīng)用程序黑名單,禁止顯示應(yīng)用程序黑名單中應(yīng)用程序的狀態(tài)欄通知。當(dāng)然,應(yīng)用程序白名單和應(yīng)用程序黑名單可結(jié)合使用。用戶可以在默認(rèn)的應(yīng)用程序白名單和/或應(yīng)用程序黑名單基礎(chǔ)上進(jìn)行調(diào)整,也可以直接采用默認(rèn)的方式。其中,應(yīng)用程序白名單或應(yīng)用程序黑名單的獲取方式如前所述,可從云端服務(wù)器獲取。
[0052]S302:狀態(tài)欄管理器將過濾條件提供給狀態(tài)欄接管服務(wù);
[0053]如前所述,狀態(tài)欄管理器和狀態(tài)欄接管服務(wù)是分別位于app層和framework層實(shí)現(xiàn)本發(fā)明狀態(tài)欄接管的兩個(gè)部分,二者協(xié)同運(yùn)行。在狀態(tài)欄管理器確定了狀態(tài)欄通知過濾條件之后,將過濾條件發(fā)送給狀態(tài)欄接管服務(wù)。當(dāng)然,也不排除狀態(tài)欄接管服務(wù)內(nèi)置或者直接獲取過濾條件的實(shí)現(xiàn)方式。
[0054]S303:狀態(tài)欄接管服務(wù)向系統(tǒng)用戶界面(SystemUi)進(jìn)程發(fā)送狀態(tài)欄通知顯示命令,指示系統(tǒng)用戶界面(SystemUi)進(jìn)程僅在智能終端上顯示滿足過濾條件的狀態(tài)欄通知。
[0055]步驟S303之前,需要由狀態(tài)欄接管服務(wù)代替現(xiàn)有技術(shù)中system server進(jìn)程中的Notificat1nManagerService去調(diào)用SystemUi進(jìn)程,具體的,不是由Notificat1nManagerService去調(diào)用SystemUi進(jìn)程,而是通過代碼注入方式,狀態(tài)欄接管服務(wù)檢測到system server進(jìn)程調(diào)用狀態(tài)欄通知顯示命令的