PendingIntent & RemoteViews 工作過程 - Notification & 桌面小部件 工作原理

開發(fā)中經常使用的 Notification 以及 桌面小部件都是講應用進程的 view 現實在系統(tǒng)進程中动壤,這么神奇的事情是如何實現的颖对,這篇文章會說明白荣月,主要是對 PendingIntent 和 RemoteViews 的使用。

一兴垦、PendingIntent

首先肤视,在使用 Notification 時如果我們要為 View 添加點擊事件档痪,都會使用到 PendingIntent 類,那么 PendingIntent 是什么邢滑,PendingIntent 是一種在遠程進程中響應的 Intent腐螟,關于 PendingIntent 的 flag 參數有幾點需要注意,下面細看

PendingIntent 的 flag

1. PendingIntent.FLAG_ONE_SHOT 這個標記的表現為困后,如果兩個 RemoteViews 使用了同一個 PendingIntent乐纸,如果一個 RemoteViews 的點擊事件被激活,則 PendingIntent 則會失效摇予,其他的 Remoteviews 的響應事件將會消失汽绢,表現為點擊沒有反應。

2. PendingIntent.FLAG_CANCEL_CURRENT 這個標記表現為侧戴,如果兩個 RemoteViews 使用的 PendingIntent 是相同的(相同的定義為 Intent 相同宁昭,并且 requestCode 相同,并不是同一個)酗宋,那么之前使用這個 PendingIntent 的會 cancel积仗,第二個的 PendingIntent 為重新創(chuàng)建的,可以正常工作本缠,舊的 RemoteViews 設置的 PendingIntent 會失效

3. PendingIntent.FLAG_UPDATE_CURRENT 這個標記位斥扛,只要有相同的 PendingInten 其都會更新

PendingIntent 的主要方法

1. get 系列方法 在 NMS 中注冊 PendingIntent入问,注冊之后丹锹,PendingIntent 的 send 方法被調用時會執(zhí)行 PendingIntent 初始化時設定的操作

2. send 方法,激活已注冊的 PendingIntent芬失,在遠程進程中注冊的事件被激活時楣黍,則會通過 IPC 調用 PendingIntent 中指定的操作

3. cancel 取消注冊的 PendingIntent ,取消之后 send 方法將失效

二棱烂、RemoteViews

  1. RemoteViews 繼承了 Parcelable 接口租漂,是可以跨進程傳遞的

  2. 創(chuàng)建時需要需要指明 View 的布局 id,以及該布局所在的進程的包名,創(chuàng)建 RemoteViews

  3. 調用 RemoteViews.setOnClickPendingIntent 方法哩治,為 RemoteViews 添加點擊事件

RemoteViews 使用

  1. 本地進程創(chuàng)建 RemoteViews 對象秃踩,并在 set 系列方法時創(chuàng)建 Action 對象,并加入 RemoteViews 內部的集合中

  2. 通過 NMS 將 RemoteViews 傳遞到系統(tǒng)進程

  3. 系統(tǒng)進程得到 RemoteViews 业筏,根據包名和 layoutId 得到 View憔杨,調用 performApply 方法,其中遍歷 Action 集合中的 Action 對象并調用其 applay/reApply蒜胖,為 View 中的子 View 初始化顯示消别,最后再系統(tǒng)進程將 view 顯示

1. Action 原理

Action 在構造方法中保存了待操作的 View 的 id,要操作方法名台谢,以及要設置的屬性值寻狂,需要顯示時調用 Action 對象的 applay/reApply 方法通過反射調用相應 id 的控件的對應方法,并將要設置的值傳入朋沮,實現在遠程進程中的設置蛇券。

注意,在布局文件中應該指定控件的顏色等信息朽们,如果跨進程怀读,這些如果是默認狀態(tài)可能效果不同預期,所以需要確定這些信息時要對 RemoteViews 顯式設置

2. RemoteViews 單擊事件

RemoteViews 中只支持 PendingIntent骑脱,不支持 OnClickListener菜枷,所以需要為 RemoteViews 設置單機事件時需要通過 setPendingIntent 方法設置添加

如果要給 ListView 添加 item 的點擊事件,必須將 setPendingIntentTemplate 和 setOnClickFillIntent 組合使用

三叁丧、RemoteViews 的使用及意義

1啤誊、Notification 頂部通知

Nofication 在創(chuàng)建時其實就是通過 RemoteViews 來設置要顯示的布局,再調用 NotificationManager 的 notify 方法拥娄,notify 方法中會通過 IPC 將 RemoteViews 傳遞到 NotificationManagerService 系統(tǒng)服務中蚊锹,NMS 中根據 id 和包名得到 layout 布局,在調用 RemoteViews 的 applay/reApplay 方法初始化布局顯示稚瘾,最后將布局顯示到屏幕上

2牡昆、AppWidget 桌面小部件點擊時顯示修改

AppWidget 同樣使用 RemoteViews 來實現,AppWidgetProvider 是一個廣播接收者摊欠,運行在應用進程丢烘,通過特定的注冊方式系統(tǒng)可以將其關聯的小部件顯示到桌面上并添加單擊響應事件。在收到響應時系統(tǒng)會通過廣播的形式將對應事件發(fā)送到AppWidgetProvider 中些椒,相對于 AppWidgetProvider 桌面小部件所在的系統(tǒng)進程是遠程進程播瞳,所以要修改桌面小部件的顯示時需要通過 RemoteViews 來將需要顯示的布局傳遞到系統(tǒng)進程中

在 AppWidgetProvider 中收到單擊事件時,首先構建 RemoteViews 免糕,并通過 set 系列方法設置布局顯示以及添加點擊響應 PendingIntent赢乓,然后調用 AppWidgetManager 的 updateAppWidget 方法忧侧。updateAppWidget 該方法中會通過 IPC 調用 AppWidgetManagerService 的 updateAppWidgetProvider 方法將 RemoteViews 傳遞到系統(tǒng)進程,AppWidgetManagerService 中會根據 RemoteViews 的布局來更新舊的桌面小部件實現單擊時桌面小部件顯示的變化牌芋。

3蚓炬、開發(fā)中其他需要在 A 進程中指定 B 進程界面顯示的情況

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躺屁,隨后出現的幾起案子试吁,更是在濱河造成了極大的恐慌,老刑警劉巖楼咳,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熄捍,死亡現場離奇詭異,居然都是意外死亡母怜,警方通過查閱死者的電腦和手機爷辙,發(fā)現死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門纬朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凑术,“玉大人移盆,你說我怎么就攤上這事」煊颍” “怎么了袱耽?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長干发。 經常有香客問我朱巨,道長,這世上最難降的妖魔是什么枉长? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任冀续,我火速辦了婚禮,結果婚禮上必峰,老公的妹妹穿的比我還像新娘洪唐。我一直安慰自己,他們只是感情好吼蚁,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布凭需。 她就那樣靜靜地躺著,像睡著了一般肝匆。 火紅的嫁衣襯著肌膚如雪粒蜈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天术唬,我揣著相機與錄音薪伏,去河邊找鬼滚澜。 笑死粗仓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播借浊,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塘淑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚂斤?” 一聲冷哼從身側響起存捺,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曙蒸,沒想到半個月后捌治,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡纽窟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年肖油,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臂港。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡森枪,死狀恐怖,靈堂內的尸體忽然破棺而出审孽,到底是詐尸還是另有隱情县袱,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布佑力,位于F島的核電站式散,受9級特大地震影響,放射性物質發(fā)生泄漏打颤。R本人自食惡果不足惜杂数,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘸洛。 院中可真熱鬧揍移,春花似錦、人聲如沸反肋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽石蔗。三九已至罕邀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間养距,已是汗流浹背诉探。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棍厌,地道東北人肾胯。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓竖席,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敬肚。 傳聞我的和親對象是個殘疾皇子毕荐,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容