Android 通知栏Notification
Android 通知欄Notification
? ? ? 在android的應(yīng)用層中,涉及到很多應(yīng)用框架,例如:Service框架,Activity管理機(jī)制,Broadcast機(jī)制,對話框框架,標(biāo)題欄框架,狀態(tài)欄框架,通知機(jī)制,ActionBar框架等等。
? ? ?下面就來說說經(jīng)常會使用到通知機(jī)制中的通知欄框架(Notificaiton),它適用于交互事件的通知。它是位于頂層可以展開的通知列表。它會時不時的提醒你什么軟件該更新了,什么人發(fā)你微信消息了等。
(網(wǎng)上看了下,全面介紹的文章不多,所以就萌生了寫這篇的念頭,隨便當(dāng)作回顧筆記。下面我就通過官方文檔、源代碼、書上的一些資料匯總下這一塊的知識,并通過一個通知欄的匯總DEMO讓大家更好的了解這個類的使用,內(nèi)容有點(diǎn)多,可以根據(jù)需求看目錄學(xué)習(xí))。
? ? Notificaiton狀態(tài)通知欄:
功能作用
1.顯示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信) ?
2.顯示客戶端的推送消息(如有新版本發(fā)布,廣告,推薦新聞等)?
3.顯示正在進(jìn)行的事物(例如:后臺運(yùn)行的程序)(如音樂播放器、版本更新時候的下載進(jìn)度等)
思維導(dǎo)圖結(jié)構(gòu)
思維導(dǎo)圖的大體結(jié)構(gòu)(按照各個節(jié)點(diǎn)延伸拓展學(xué)習(xí))
Notificaiton -- service ? --?BroadcastReceiver ?-- Intent(flag、Action等屬性應(yīng)用) -- ?PendingIntent
感慨:
一個Notificaiton通知的拓展使用就要涉及與4大組建的配合,所以學(xué)好整體的知識體系。
聯(lián)系:
1.由于service 是在后臺運(yùn)行,所以它意圖做什么我們看不到,可以通過Notificaiton 來顯示提醒(如音樂的后臺播放)。
2.service服務(wù)和BroadcastReceiver廣播相結(jié)合,在加上Notificaiton?顯示(如程序的后臺更新)。
3.Intent作為意圖處理,和Notificaiton的點(diǎn)擊時間緊密結(jié)合在了一起,并且與BroadcastReceiver和service的聯(lián)系也緊密不可以分割。
(service 在后臺之后通過BroadcastReceiver來通知Notificaiton?顯示相關(guān)東西,在通過Intent完成用戶的意圖操作)
相關(guān)文檔:Activity啟動模式 及 Intent Flags 與 棧 的關(guān)聯(lián)分析
對應(yīng)的官方鏈接
設(shè)計(jì)文檔 : ?? 官方:http://developer.android.com/design/patterns/notifications.html譯文:http://adchs.github.io/patterns/notifications.html 使用教程 :http://developer.android.com/training/notify-user/index.html? 開發(fā)文檔 :http://developer.android.com/reference/android/app/Notification.html
大體了解
? ? ?Notification支持文字內(nèi)容顯示、震動、三色燈、鈴聲等多種提示形式,在默認(rèn)情況下,Notification僅顯示消息標(biāo)題、消息內(nèi)容、送達(dá)時間這3項(xiàng)內(nèi)容。以下就是通知的基本布局。
通知的基本布局:
普通視圖:
高度64dp
大試圖的通知在展開前也顯示為普通視圖
元素:
1.?標(biāo)題 ? Title/Name
2.?大圖標(biāo) ?Icon/Photo
3.?內(nèi)容文字 ??
4.?內(nèi)容信息 ??MESSAGE
5.?小圖標(biāo) Secondary Icon
6.?通知的時間 Timestamp,默認(rèn)為系統(tǒng)發(fā)出通知的時間,也可通過setWhen()來設(shè)置
相關(guān)分析
狀態(tài)通知欄主要涉及到2個類: ?Notification 和?NotificationManager?
Notification為通知信息類,它里面對應(yīng)了通知欄的各個屬性
NotificationManager?: ?是狀態(tài)欄通知的管理類,負(fù)責(zé)發(fā)通知、清除通知等操作。
注意:NotificationManager 是一個系統(tǒng)Service,所以必須通過?getSystemService(NOTIFICATION_SERVICE)方法來獲取,方法如下。
[java]?view plaincopy使用步驟:
流程模塊:
第一步:
創(chuàng)建一個通知欄的Builder構(gòu)造類 ?(Create a Notification Builder)
第二步:
定義通知欄的Action ?(Define the Notification's Action)
第三步:
設(shè)置通知欄點(diǎn)擊事件 ? ?(Set the Notification's Click Behavior)
第四步:
通知 ? (Issue the Notification)
代碼模塊:
實(shí)現(xiàn)系統(tǒng)默認(rèn)的通知欄效果:
第一步:獲取狀態(tài)通知欄管理:
[java]?view plaincopy第二步:實(shí)例化通知欄構(gòu)造器NotificationCompat.Builder:
[java]?view plaincopy第三步:對Builder進(jìn)行配置:
[java]?view plaincopy
對應(yīng)的各個方法的屬性(部分方法以上代碼中已經(jīng)作注釋,就不再介紹):
(1)方法:設(shè)置提醒標(biāo)志符Flags
功能:提醒標(biāo)志符,向通知添加聲音、閃燈和振動效果等設(shè)置達(dá)到通知提醒效果,可以組合多個屬性
有2種設(shè)置方法:
1.實(shí)例化通知欄之后通過給他添加.flags屬性賦值。
[java]?view plaincopy
[java]?view plaincopy
Notification.FLAG_SHOW_LIGHTS ? ? ? ? ? ? ?//三色燈提醒,在使用三色燈提醒時候必須加該標(biāo)志符
Notification.FLAG_ONGOING_EVENT ? ? ? ? ?//發(fā)起正在運(yùn)行事件(活動中)
Notification.FLAG_INSISTENT? ?//讓聲音、振動無限循環(huán),直到用戶響應(yīng)?(取消或者打開)
Notification.FLAG_ONLY_ALERT_ONCE ?//發(fā)起Notification后,鈴聲和震動均只執(zhí)行一次
Notification.FLAG_AUTO_CANCEL ? ? ?//用戶單擊通知后自動消失
Notification.FLAG_NO_CLEAR ? ? ? ? ?//只有全部清除時,Notification才會清除?,不清楚該通知(QQ的通知無法清除,就是用的這個)
Notification.FLAG_FOREGROUND_SERVICE ? ?//表示正在運(yùn)行的服務(wù)
(2)方法:.setDefaults(int defaults) ? ? (NotificationCompat.Builder中的方法,用于提示)
功能:向通知添加聲音、閃燈和振動效果的最簡單、使用默認(rèn)(defaults)屬性,可以組合多個屬性(和方法1中提示效果一樣的)
對應(yīng)屬性:
Notification.DEFAULT_VIBRATE ? ?//添加默認(rèn)震動提醒 ?需要 VIBRATE permissionNotification.DEFAULT_SOUND ? ?//?添加默認(rèn)聲音提醒
Notification.DEFAULT_LIGHTS//?添加默認(rèn)三色燈提醒Notification.DEFAULT_ALL//?添加默認(rèn)以上3種全部提醒
(3)方法:setVibrate(long[] pattern)
功能:設(shè)置震動方式。
使用:
[java]?view plaincopy
以上方法的還有種寫法是
[java]?view plaincopy
如果希望設(shè)置默認(rèn)振動方式,設(shè)置了方法(2)中默認(rèn)為DEFAULT_VIBRATE 即可。
(4)方法:.setLights(intledARGB?,intledOnMS?,intledOffMS?)
功能:android支持三色燈提醒,這個方法就是設(shè)置不同場景下的不同顏色的燈。
描述:其中ledARGB 表示燈光顏色、?ledOnMS 亮持續(xù)時間、ledOffMS 暗的時間。
注意:1)只有在設(shè)置了標(biāo)志符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒。
? ? ? ? ? 2)這邊的顏色跟設(shè)備有關(guān),不是所有的顏色都可以,要看具體設(shè)備。
使用:
[java]?view plaincopy
[java]?view plaincopy
(5)方法:.setSound(Uri?sound)
功能:設(shè)置默認(rèn)或則自定義的鈴聲,來提醒。
[java]?view plaincopy
同理相同效果的另一種設(shè)置方法這邊就不講, 和上面的都是一樣的。
(6)方法:.setPriority(int pri)
功能:設(shè)置優(yōu)先級
對應(yīng)優(yōu)先級描述如下圖:
| MAX | 重要而緊急的通知,通知用戶這個事件是時間上緊迫的或者需要立即處理的。 |
| HIGH | 高優(yōu)先級用于重要的通信內(nèi)容,例如短消息或者聊天,這些都是對用戶來說比較有興趣的。 |
| DEFAULT | 默認(rèn)優(yōu)先級用于沒有特殊優(yōu)先級分類的通知。 |
| LOW | 低優(yōu)先級可以通知用戶但又不是很緊急的事件。 |
| MIN | 用于后臺消息 (例如天氣或者位置信息)。最低優(yōu)先級通知將只在狀態(tài)欄顯示圖標(biāo),只有用戶下拉通知抽屜才能看到內(nèi)容。 |
對應(yīng)屬性(作用看上圖就可知道):
Notification.PRIORITY_DEFAULT
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOWNotification.PRIORITY_MAX
Notification.PRIORITY_MIN
(7)方法:setOngoing(boolean ongoing)
功能:設(shè)置為ture,表示它為一個正在進(jìn)行的通知。他們通常是用來表示一個后臺任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(shè)備(如一個文件下載,同步操作,主動網(wǎng)絡(luò)連接)
(8)方法:setProgress(int max, int progress,boolean indeterminate)
屬性:max:進(jìn)度條最大數(shù)值 ?、progress:當(dāng)前進(jìn)度、indeterminate:表示進(jìn)度是否不確定,true為不確定,如下第3幅圖所示 ?,false為確定下第1幅圖所示
功能:設(shè)置帶進(jìn)度條的通知,可以在下載中使用
效果圖如下:
? ? ? ?
注意:此方法在4.0及以后版本才有用,如果為早期版本:需要自定義通知布局,其中包含ProgressBar視圖
使用:如果為確定的進(jìn)度條:調(diào)用setProgress(max, progress, false)來設(shè)置通知,在更新進(jìn)度的時候在此發(fā)起通知更新progress,并且在下載完成后要移除進(jìn)度條,通過調(diào)用setProgress(0, 0, false)既可。
如果為不確定(持續(xù)活動)的進(jìn)度條,這是在處理進(jìn)度無法準(zhǔn)確獲知時顯示活動正在持續(xù),所以調(diào)用setProgress(0, 0, true)?,操作結(jié)束時,調(diào)用setProgress(0, 0, false)并更新通知以移除指示條
第四步:設(shè)置通知欄PendingIntent(點(diǎn)擊動作事件等都包含在這里)
在第三步中,沒有提到一個方法,就是setContentIntent(PendingIntent?intent)這個方法,這里拿到這里講。
知識點(diǎn)
1)什么是PendingIntent
PendingIntent和Intent略有不同,它可以設(shè)置執(zhí)行次數(shù),主要用于遠(yuǎn)程服務(wù)通信、鬧鈴、通知、啟動器、短信中,在一般情況下用的比較少。
2)PendingIntent什么用
Notification支持多種Intent來響應(yīng)單擊事件、消除事件、處理緊急狀態(tài)的全屏事件等。
這里就用到了setContentIntent(PendingIntent?intent)來處理以上這么多的事件。
3)相關(guān)屬性和方法
屬性:
PendingIntent的位標(biāo)識符:
FLAG_ONE_SHOT ? 表示返回的PendingIntent僅能執(zhí)行一次,執(zhí)行完后自動取消
FLAG_NO_CREATE ? ??表示如果描述的PendingIntent不存在,并不創(chuàng)建相應(yīng)的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT ? ???表示相應(yīng)的PendingIntent已經(jīng)存在,則取消前者,然后創(chuàng)建新的PendingIntent,這個有利于數(shù)據(jù)保持為最新的,可以用于即時通信的通信場景
FLAG_UPDATE_CURRENT ? ? 表示更新的PendingIntent
方法:
可以看出,它支持多種相應(yīng)方式,有Activity、Broadcast、Service,就根據(jù)你自身需求去選擇。
在各種情況下情況下它還會根據(jù)各種情況出發(fā)效果:
contentIntent:在通知窗口區(qū)域,Notification被單擊時的響應(yīng)事件由該intent觸發(fā);
deleteIntent:當(dāng)用戶點(diǎn)擊全部清除按鈕時,響應(yīng)該清除事件的Intent;
fullScreenIntent:響應(yīng)緊急狀態(tài)的全屏事件(例如來電事件),也就是說通知來的時候,跳過在通知區(qū)域點(diǎn)擊通知這一步,直接執(zhí)行fullScreenIntent代表的事件。
例如:在執(zhí)行了點(diǎn)擊通知之后要跳轉(zhuǎn)到指定的XXX的Activity的時候,可以設(shè)置以下方法來相應(yīng)點(diǎn)擊事件:
[java]?view plaincopy
例如:在執(zhí)行了清空全部的通知操作時候,可以設(shè)置以下方法來相應(yīng)這個事件:
采用setDeleteIntent(PendingIntent?intent)方法或按照以下寫法
[java]?view plaincopy
例如:在響應(yīng)緊急事件(如來電)時候,可以設(shè)置以下方法來相應(yīng)這個事件:
采用setFullScreenIntent(PendingIntent?intent, boolean highPriority)
第五步,最簡單的一部,發(fā)送通知請求
[java]?view plaincopy
拓展
實(shí)現(xiàn)自定義的通知欄效果:
這里要用到RemoteViews這個類。實(shí)現(xiàn)以下2種自定義布局。
注意:Notification的自定義布局是RemoteViews,和其他RemoteViews一樣,在自定義視圖布局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件,不支持這些類的子類或Android提供的其他控件。否則會引起ClassNotFoundException異常
步驟如下:
1)創(chuàng)建自定義視圖
2)獲取遠(yuǎn)程視圖對象(注:Notification的contentView不能為空)
3)設(shè)置PendingIntent(來響應(yīng)各種事件)
4)發(fā)起Notification
大體4步驟這里就不詳細(xì)說了,下面就把DEMO中的列子拿出來說下
樣式:
1.自定義帶按鈕通知欄(如下樣式)
正在進(jìn)行的
“正在進(jìn)行的”通知使用戶了解正在運(yùn)行的后臺進(jìn)程。例如,音樂播放器可以顯示正在播放的音樂。也可以用來顯示需要長時間處理的操作,例如下載或編碼視頻。“正在進(jìn)行的”通知不能被手動刪除。
之后調(diào)用: [java]?view plaincopy
實(shí)現(xiàn):大視圖風(fēng)格通知(注:4.1之前的版本不支持大視圖)
只在通知被展開時顯示
何時展開:通知處在頂端,或者用戶通過收拾展開
收件箱風(fēng)格的通知:
相比普通視圖,只多出:7. 詳情區(qū)域
效果圖如下:
詳情區(qū)域根據(jù)用途可有多種風(fēng)格:
1.NotificationCompat.BigPictureStyle?大圖片風(fēng)格:詳情區(qū)域包含一個256dp高度的位圖
2.NotificationCompat.BigTextStyle?大文字風(fēng)格:顯示一個大的文字塊
3.NotificationCompat.InboxStyle ?收件箱風(fēng)格:顯示多行文字 ?
各種風(fēng)格都具有以下常規(guī)視圖不具有的內(nèi)容選項(xiàng):
1.大標(biāo)題:在展開視圖時替代普通視圖的標(biāo)記
2.總結(jié)文字:允許你在詳情區(qū)域之下增加一行內(nèi)容
拿收件箱風(fēng)格為例,實(shí)現(xiàn)代碼如下: [java]?view plaincopy
開發(fā)中碰到的問題
(注:下面所指的低版本是指2.3及2.3以下版本)
1.如何取消掉通知欄上的通知
? (1)設(shè)置對應(yīng)的flags,讓用戶點(diǎn)擊既被消除:
notification.flags = FLAG_AUTO_CANCEL;
? ? (2) 通過手動消除某項(xiàng)或則全部通知
mNotificationMgr.cancle(NOTIFICATION_ID);//消除對應(yīng)ID的通知
mNotificationMgr.cancleAll();//消除創(chuàng)建的所有通知
2.低版本中的部分方法已經(jīng)被棄用的
?(1)Notification.Builder(this).getNotification()
?(2)mNotification.setLatestEventInfo(this, "title", "content", null); ?
這些方法都已經(jīng)被啟用,雖然還有效果,可是不建議使用。所以開發(fā)過程中盡量使用NotificationCompat.Builder(this)的構(gòu)建方法去創(chuàng)建一個通知類。
3.低版本中會報(bào)的錯誤及解決方案:
(1)錯誤代碼:java.lang.IllegalArgumentException: contentIntent required: pkg=com.example.notifications id=100 notification=Notification(vibrate=default,sound=null,defaults=0x2,flags=0x0)
解決方案:如果在高版本不會出錯,而在2.3上面報(bào)了這個錯誤,通過開發(fā)文檔中的以下知道你可以找打:
For this reason, you should always ensure that UI controls in a notification are also available in an?Activity?in your app, and you should always start that?Activity?when users click the notification. To do this, use the?setContentIntent()?method.
你就應(yīng)該知道,缺少了setContentIntent()?這個方法,在2.3及更低的版本中,必須給它設(shè)置設(shè)置contentIntent,如果你點(diǎn)擊沒有意圖,可以在賦值的的Intent中設(shè)置為new Intent()既可,切記contentIntent不能為空。
代碼如下:
[java]?view plaincopy
(2)錯誤代碼:android.app.RemoteServiceException: Bad notification posted from package com.example.notifications: Couldn't expand RemoteViews for: StatusBarNotification(package=com.example.notifications id=101 tag=null notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x2))
解決方法:
在自定義的時候,發(fā)現(xiàn)了這個問題,解決:每次更新時都必須把RemoteViews給new出來才行,不能利用已有的notification.contentView直接操作!
4.低版本中,自定義的通知欄中如果帶有按鈕,可能按鈕點(diǎn)擊事件會失靈
解決方法:看其它的應(yīng)用,好像在低版本都會隱藏掉那些按鈕,就是為了不影響用戶體驗(yàn),所以應(yīng)該就這么解決,判斷版本號在去決定是否現(xiàn)在按鈕。
5.低版本中,自定義布局中的字體顏色看不清
如右圖:
解決方案:
由于2.3及之前版本,背景設(shè)是白色的那我們定義字體顏色為系統(tǒng)預(yù)設(shè)的顏色:
?android:attr/textColorPrimary
在資源的src/values目錄中的style.xml文件中設(shè)置它標(biāo)題和內(nèi)容的樣式為:
[java]?view plaincopy
在2.3之后的版本中(即API >=9的版本中),在資源文件下的src/values-v9目錄中的style.xml文件中設(shè)置它標(biāo)題和內(nèi)容的樣式為:
[java]?view plaincopy
最后賦給自定義布局中的對應(yīng)標(biāo)題和內(nèi)容對應(yīng)的style即可。
對應(yīng)解決網(wǎng)址:
1.http://stackoverflow.com/questions/6250356/how-to-use-default-notification-style
2.http://stackoverflow.com/questions/4867338/custom-notification-layouts-and-text-colors/7320604#7320604
3.http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView ? (官方文檔)
http://developer.android.com/about/versions/android-2.2-highlights.html
6.低版本中mBuilder.setProgress(100, progress, false);沒用,不顯示進(jìn)度條
解決方法:此方法在4.0及以后版本才有用,如果為早期版本:需要自定義通知布局,其中包含ProgressBar視圖
7.自定義布局的時候,不同版本方法不一樣。(弄了半天,在2.3版本不顯示,原來是方法不兼容)
2.3及2.3之前:
通過
[java]?view plaincopy
2.3之后:
通過Builder以下方法賦于自定義布局。
mBuilder.setContent(view_custom)
這里就不貼DEMO中的代碼了,大家可以下個DEMO自己看,里面也都有注釋的,可能有的地方會有錯誤,忘大家指出,以便及時修改,謝謝。
一個DEMO讓你更懂Notification
DEMO截圖:
? ? ?? ? ?
DEMO下載:下載地址
http://blog.csdn.net/vipzjyno1/article/details/25248021/總結(jié)
以上是生活随笔為你收集整理的Android 通知栏Notification的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java I/O流InputStream
- 下一篇: 将tensorflow训练好的模型移植到