在android的應用層中,涉及到不少應用框架,例如:Service框架,Activity管理機制,Broadcast機制,對話框框架,標題欄框架,狀態欄框架,通知機制,ActionBar框架等等。html
下面就來講說常常會使用到通知機制中的通知欄框架(Notificaiton),它適用於交互事件的通知。它是位於頂層能夠展開的通知列表。它會時不時的提醒你什麼軟件該更新了,什麼人發你微信消息了等。java
(網上看了下,全面介紹的文章很少,因此就萌生了寫這篇的念頭,隨便看成回顧筆記。下面我就經過官方文檔、源代碼、書上的一些資料彙總下這一塊的知識,並經過一個通知欄的彙總DEMO讓你們更好的瞭解這個類的使用,內容有點多,能夠根據需求看目錄學習)。android
Notificaiton狀態通知欄:git
1.顯示接收到短消息、即便消息等信息 (如QQ、微信、新浪、短信)
2.顯示客戶端的推送消息(若有新版本發佈,廣告,推薦新聞等)
3.顯示正在進行的事物(例如:後臺運行的程序)(如音樂播放器、版本更新時候的下載進度等)github
思惟導圖的大致結構(按照各個節點延伸拓展學習)微信
Notificaiton -- service -- BroadcastReceiver -- Intent(flag、Action等屬性應用) -- PendingIntent網絡
感慨:app
一個Notificaiton通知的拓展使用就要涉及與4大組建的配合,因此學好總體的知識體系。框架
聯繫:ide
1.因爲service 是在後臺運行,因此它意圖作什麼咱們看不到,能夠經過Notificaiton 來顯示提醒(如音樂的後臺播放)。
2.service服務和BroadcastReceiver廣播相結合,在加上Notificaiton 顯示(如程序的後臺更新)。
3.Intent做爲意圖處理,和Notificaiton的點擊時間緊密結合在了一塊兒,而且與BroadcastReceiver和service的聯繫也緊密不能夠分割。
(service 在後臺以後經過BroadcastReceiver來通知Notificaiton 顯示相關東西,在經過Intent完成用戶的意圖操做)
相關文檔:Activity啓動模式 及 Intent Flags 與 棧 的關聯分析
開發文檔 :http://developer.android.com/reference/android/app/Notification.html
Notification支持文字內容顯示、震動、三色燈、鈴聲等多種提示形式,在默認狀況下,Notification僅顯示消息標題、消息內容、送達時間這3項內容。如下就是通知的基本佈局。
通知的基本佈局:
普通視圖:
高度64dp
大試圖的通知在展開前也顯示爲普通視圖
元素:
1. 標題 Title/Name
2. 大圖標 Icon/Photo
3. 內容文字
4. 內容信息 MESSAGE
5. 小圖標 Secondary Icon
6. 通知的時間 Timestamp,默認爲系統發出通知的時間,也可經過setWhen()來設置
狀態通知欄主要涉及到2個類: Notification 和 NotificationManager
Notification爲通知信息類,它裏面對應了通知欄的各個屬性
NotificationManager : 是狀態欄通知的管理類,負責發通知、清除通知等操做。
注意:NotificationManager 是一個系統Service,因此必須經過 getSystemService(NOTIFICATION_SERVICE)方法來獲取,方法以下。
第一步:
建立一個通知欄的Builder構造類 (Create a Notification Builder)
第二步:
定義通知欄的Action (Define the Notification's Action)
第三步:
設置通知欄點擊事件 (Set the Notification's Click Behavior)
第四步:
通知 (Issue the Notification)
實現系統默認的通知欄效果:
第一步:獲取狀態通知欄管理:
第二步:實例化通知欄構造器NotificationCompat.Builder:
第三步:對Builder進行配置:
功能:提醒標誌符,向通知添加聲音、閃燈和振動效果等設置達到通知提醒效果,能夠組合多個屬性
有2種設置方法:
1.實例化通知欄以後經過給他添加.flags屬性賦值。
2.經過setContentIntent(PendingIntent intent)方法中的意圖設置對應的flags
提醒標誌符成員:
Notification.FLAG_SHOW_LIGHTS //三色燈提醒,在使用三色燈提醒時候必須加該標誌符
Notification.FLAG_ONGOING_EVENT //發起正在運行事件(活動中)
Notification.FLAG_INSISTENT //讓聲音、振動無限循環,直到用戶響應 (取消或者打開)
Notification.FLAG_ONLY_ALERT_ONCE //發起Notification後,鈴聲和震動均只執行一次
Notification.FLAG_AUTO_CANCEL //用戶單擊通知後自動消失
Notification.FLAG_NO_CLEAR //只有所有清除時,Notification纔會清除 ,不清楚該通知(QQ的通知沒法清除,就是用的這個)
Notification.FLAG_FOREGROUND_SERVICE //表示正在運行的服務
功能:向通知添加聲音、閃燈和振動效果的最簡單、使用默認(defaults)屬性,能夠組合多個屬性(和方法1中提示效果同樣的)
對應屬性:
Notification.DEFAULT_VIBRATE //添加默認震動提醒 須要 VIBRATE permission
Notification.DEFAULT_SOUND // 添加默認聲音提醒
Notification.DEFAULT_LIGHTS// 添加默認三色燈提醒
Notification.DEFAULT_ALL// 添加默認以上3種所有提醒
功能:設置震動方式。
使用:
實現效果:延遲0ms,而後振動300ms,在延遲500ms,接着在振動700ms。
以上方法的還有種寫法是
以此類推,2種寫法均可以。
若是但願設置默認振動方式,設置了方法(2)中默認爲DEFAULT_VIBRATE 便可。
功能:android支持三色燈提醒,這個方法就是設置不一樣場景下的不一樣顏色的燈。
描述:其中ledARGB 表示燈光顏色、 ledOnMS 亮持續時間、ledOffMS 暗的時間。
注意:1)只有在設置了標誌符Flags爲Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒。
2)這邊的顏色跟設備有關,不是全部的顏色均可以,要看具體設備。
使用:
同理,如下方法也能夠設置一樣效果:
若是但願使用默認的三色燈提醒,設置了方法(2)中默認爲DEFAULT_LIGHTS便可。
功能:設置默認或則自定義的鈴聲,來提醒。
同理相同效果的另外一種設置方法這邊就不講, 和上面的都是同樣的。
功能:設置優先級
對應優先級描述以下圖:
優先級 | 用戶 |
---|---|
MAX | 重要而緊急的通知,通知用戶這個事件是時間上緊迫的或者須要當即處理的。 |
HIGH | 高優先級用於重要的通訊內容,例如短消息或者聊天,這些都是對用戶來講比較有興趣的。 |
DEFAULT | 默認優先級用於沒有特殊優先級分類的通知。 |
LOW | 低優先級能夠通知用戶但又不是很緊急的事件。 |
MIN | 用於後臺消息 (例如天氣或者位置信息)。最低優先級通知將只在狀態欄顯示圖標,只有用戶下拉通知抽屜才能看到內容。 |
對應屬性(做用看上圖就可知道):
Notification.PRIORITY_DEFAULT
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOW
Notification.PRIORITY_MAX
Notification.PRIORITY_MIN
功能:設置爲ture,表示它爲一個正在進行的通知。他們一般是用來表示一個後臺任務,用戶積極參與(如播放音樂)或以某種方式正在等待,所以佔用設備(如一個文件下載,同步操做,主動網絡鏈接)
屬性:max:進度條最大數值 、progress:當前進度、indeterminate:表示進度是否不肯定,true爲不肯定,以下第3幅圖所示 ,false爲肯定下第1幅圖所示
功能:設置帶進度條的通知,能夠在下載中使用
效果圖以下:
注意:此方法在4.0及之後版本纔有用,若是爲早期版本:須要自定義通知佈局,其中包含ProgressBar視圖
使用:若是爲肯定的進度條:調用setProgress(max, progress, false)來設置通知,在更新進度的時候在此發起通知更新progress,而且在下載完成後要移除進度條,經過調用setProgress(0, 0, false)既可。
若是爲不肯定(持續活動)的進度條,這是在處理進度沒法準確獲知時顯示活動正在持續,因此調用setProgress(0, 0, true)
,操做結束時,調用setProgress(0, 0, false)
並更新通知以移除指示條
第四步:設置通知欄PendingIntent(點擊動做事件等都包含在這裏)
在第三步中,沒有提到一個方法,就是setContentIntent(PendingIntent intent)這個方法,這裏拿到這裏講。
PendingIntent和Intent略有不一樣,它能夠設置執行次數,主要用於遠程服務通訊、鬧鈴、通知、啓動器、短信中,在通常狀況下用的比較少。
Notification支持多種Intent來響應單擊事件、消除事件、處理緊急狀態的全屏事件等。
這裏就用到了setContentIntent(PendingIntent intent)來處理以上這麼多的事件。
屬性:
PendingIntent的位標識符:
FLAG_ONE_SHOT 表示返回的PendingIntent僅能執行一次,執行完後自動取消
FLAG_NO_CREATE 表示若是描述的PendingIntent不存在,並不建立相應的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT 表示相應的PendingIntent已經存在,則取消前者,而後建立新的PendingIntent,這個有利於數據保持爲最新的,能夠用於即時通訊的通訊場景
FLAG_UPDATE_CURRENT 表示更新的PendingIntent
方法:
能夠看出,它支持多種相應方式,有Activity、Broadcast、Service,就根據你自身需求去選擇。
在各類狀況下狀況下它還會根據各類狀況出發效果:
contentIntent:在通知窗口區域,Notification被單擊時的響應事件由該intent觸發;
deleteIntent:當用戶點擊所有清除按鈕時,響應該清除事件的Intent;
fullScreenIntent:響應緊急狀態的全屏事件(例如來電事件),也就是說通知來的時候,跳過在通知區域點擊通知這一步,直接執行fullScreenIntent表明的事件。
例如:在執行了點擊通知以後要跳轉到指定的XXX的Activity的時候,能夠設置如下方法來相應點擊事件:
例如:在執行了清空所有的通知操做時候,能夠設置如下方法來相應這個事件:
採用setDeleteIntent(PendingIntent intent)方法或按照如下寫法
例如:在響應緊急事件(如來電)時候,能夠設置如下方法來相應這個事件:
採用setFullScreenIntent(PendingIntent intent, boolean highPriority)
第五步,最簡單的一部,發送通知請求
這裏要用到RemoteViews這個類。實現如下2種自定義佈局。
Notification的自定義佈局是RemoteViews,和其餘RemoteViews同樣,在自定義視圖佈局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種佈局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件,不支持這些類的子類或Android提供的其餘控件。不然會引發ClassNotFoundException異常
步驟以下:
1)建立自定義視圖
2)獲取遠程視圖對象(注:Notification的contentView不能爲空)
3)設置PendingIntent(來響應各類事件)
4)發起Notification
大致4步驟這裏就不詳細說了,下面就把DEMO中的列子拿出來講下
樣式:
1.自定義帶按鈕通知欄(以下樣式)
正在進行的
「正在進行的」通知使用戶瞭解正在運行的後臺進程。例如,音樂播放器能夠顯示正在播放的音樂。也能夠用來顯示須要長時間處理的操做,例以下載或編碼視頻。「正在進行的」通知不能被手動刪除。
只在通知被展開時顯示
什麼時候展開:通知處在頂端,或者用戶經過收拾展開
收件箱風格的通知:
相比普通視圖,只多出:7. 詳情區域
1.NotificationCompat.BigPictureStyle 大圖片風格:詳情區域包含一個256dp高度的位圖
2.NotificationCompat.BigTextStyle 大文字風格:顯示一個大的文字塊
3.NotificationCompat.InboxStyle 收件箱風格:顯示多行文字
各類風格都具備如下常規視圖不具備的內容選項:
1.大標題:在展開視圖時替代普通視圖的標記
2.總結文字:容許你在詳情區域之下增長一行內容
(注:下面所指的低版本是指2.3及2.3如下版本)
(1)設置對應的flags,讓用戶點擊既被消除:
notification.flags = FLAG_AUTO_CANCEL;
(2) 經過手動消除某項或則所有通知
mNotificationMgr.cancle(NOTIFICATION_ID);//消除對應ID的通知
mNotificationMgr.cancleAll();//消除建立的全部通知
(1)Notification.Builder(this).getNotification()
(2)mNotification.setLatestEventInfo(this, "title", "content", null);
這些方法都已經被啓用,雖然還有效果,但是不建議使用。因此開發過程當中儘可能使用NotificationCompat.Builder(this)的構建方法去建立一個通知類。
(1)錯誤代碼:java.lang.IllegalArgumentException: contentIntent required: pkg=com.example.notifications id=100 notification=Notification(vibrate=default,sound=null,defaults=0x2,flags=0x0)
解決方案:若是在高版本不會出錯,而在2.3上面報了這個錯誤,經過開發文檔中的如下知道你能夠找打:
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.
你就應該知道,缺乏了setContentIntent()
這個方法,在2.3及更低的版本中,必須給它設置設置contentIntent,若是你點擊沒有意圖,能夠在賦值的的Intent中設置爲new Intent()既可,切記contentIntent不能爲空。
代碼以下:
(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))
解決方法:
在自定義的時候,發現了這個問題,解決:每次更新時都必須把RemoteViews給new出來才行,不能利用已有的notification.contentView直接操做!
解決方法:看其它的應用,好像在低版本都會隱藏掉那些按鈕,就是爲了避免影響用戶體驗,因此應該就這麼解決,判斷版本號在去決定是否如今按鈕。
如右圖:
解決方案:
因爲2.3及以前版本,背景設是白色的那咱們定義字體顏色爲系統預設的顏色:
?android:attr/textColorPrimary
在資源的src/values目錄中的style.xml文件中設置它標題和內容的樣式爲:
在2.3以後的版本中(即API >=9的版本中),在資源文件下的src/values-v9目錄中的style.xml文件中設置它標題和內容的樣式爲:
最後賦給自定義佈局中的對應標題和內容對應的style便可。
對應解決網址:
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
解決方法:此方法在4.0及之後版本纔有用,若是爲早期版本:須要自定義通知佈局,其中包含ProgressBar視圖
2.3及2.3以前:
經過
方法賦予VIEW。
2.3以後:
經過Builder如下方法賦於自定義佈局。
mBuilder.setContent(view_custom)
這裏就不貼DEMO中的代碼了,你們能夠下個DEMO本身看,裏面也都有註釋的,可能有的地方會有錯誤,忘你們指出,以便及時修改,謝謝。
一個DEMO讓你更懂Notification