轉(zhuǎn)載自:http://blog.csdn.net/vipzjyno1/article/details/25248021
在android的應(yīng)用層中凭迹,涉及到很多應(yīng)用框架忙芒,例如:Service框架冤吨,Activity管理機(jī)制踏幻,Broadcast機(jī)制近顷,對(duì)話框框架遂赠,標(biāo)題欄框架桐罕,狀態(tài)欄框架脉让,通知機(jī)制,ActionBar框架等等功炮。
下面就來說說經(jīng)常會(huì)使用到通知機(jī)制中的通知欄框架(Notificaiton)溅潜,它適用于交互事件的通知。它是位于頂層可以展開的通知列表薪伏。它會(huì)時(shí)不時(shí)的提醒你什么軟件該更新了滚澜,什么人發(fā)你微信消息了等。
(網(wǎng)上看了下嫁怀,全面介紹的文章不多设捐,所以就萌生了寫這篇的念頭,隨便當(dāng)作回顧筆記塘淑。下面我就通過官方文檔萝招、源代碼、書上的一些資料匯總下這一塊的知識(shí)存捺,并通過一個(gè)通知欄的匯總DEMO讓大家更好的了解這個(gè)類的使用槐沼,內(nèi)容有點(diǎn)多,可以根據(jù)需求看目錄學(xué)習(xí))召噩。
Notificaiton狀態(tài)通知欄:
功能作用
1.顯示接收到短消息母赵、即使消息等信息 (如QQ、微信具滴、新浪凹嘲、短信)
2.顯示客戶端的推送消息(如有新版本發(fā)布,廣告构韵,推薦新聞等)
3.顯示正在進(jìn)行的事物(例如:后臺(tái)運(yùn)行的程序)(如音樂播放器周蹭、版本更新時(shí)候的下載進(jìn)度等)
思維導(dǎo)圖結(jié)構(gòu)
思維導(dǎo)圖的大體結(jié)構(gòu)(按照各個(gè)節(jié)點(diǎn)延伸拓展學(xué)習(xí))
Notificaiton -- service ? --?BroadcastReceiver ?-- Intent(flag趋艘、Action等屬性應(yīng)用) --PendingIntent
感慨:
一個(gè)Notificaiton通知的拓展使用就要涉及與4大組建的配合,所以學(xué)好整體的知識(shí)體系凶朗。
聯(lián)系:
1.由于service 是在后臺(tái)運(yùn)行瓷胧,所以它意圖做什么我們看不到,可以通過Notificaiton 來顯示提醒(如音樂的后臺(tái)播放)棚愤。
2.service服務(wù)和BroadcastReceiver廣播相結(jié)合搓萧,在加上Notificaiton?顯示(如程序的后臺(tái)更新)。
3.Intent作為意圖處理宛畦,和Notificaiton的點(diǎn)擊時(shí)間緊密結(jié)合在了一起瘸洛,并且與BroadcastReceiver和service的聯(lián)系也緊密不可以分割。
(service 在后臺(tái)之后通過BroadcastReceiver來通知Notificaiton?顯示相關(guān)東西次和,在通過Intent完成用戶的意圖操作)
相關(guān)文檔:Activity啟動(dòng)模式 及 Intent Flags 與 棧 的關(guān)聯(lián)分析
對(duì)應(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)容顯示反肋、震動(dòng)、三色燈踏施、鈴聲等多種提示形式石蔗,在默認(rèn)情況下,Notification僅顯示消息標(biāo)題畅形、消息內(nèi)容养距、送達(dá)時(shí)間這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.通知的時(shí)間 Timestamp,默認(rèn)為系統(tǒng)發(fā)出通知的時(shí)間铃在,也可通過setWhen()來設(shè)置
相關(guān)分析
狀態(tài)通知欄主要涉及到2個(gè)類:Notification 和NotificationManager
Notification為通知信息類,它里面對(duì)應(yīng)了通知欄的各個(gè)屬性
NotificationManager?: ?是狀態(tài)欄通知的管理類碍遍,負(fù)責(zé)發(fā)通知、清除通知等操作阳液。
注意:NotificationManager 是一個(gè)系統(tǒng)Service怕敬,所以必須通過getSystemService(NOTIFICATION_SERVICE)方法來獲取,方法如下帘皿。
NotificationManager?mNotificationManager?=?(NotificationManager)?getSystemService(NOTIFICATION_SERVICE);
使用步驟:
流程模塊:
第一步:
創(chuàng)建一個(gè)通知欄的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)通知欄管理:
NotificationManager?mNotificationManager?=?(NotificationManager)?getSystemService(NOTIFICATION_SERVICE);
第二步:實(shí)例化通知欄構(gòu)造器NotificationCompat.Builder:
NotificationCompat.Builder?mBuilder?=newNotificationCompat.Builder(this);
第三步:對(duì)Builder進(jìn)行配置:
mBuilder.setContentTitle("測(cè)試標(biāo)題")//設(shè)置通知欄標(biāo)題
? ? ? ? .setContentText("測(cè)試內(nèi)容")?//設(shè)置通知欄顯示內(nèi)容
? ? ? ? .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL))//設(shè)置通知欄點(diǎn)擊意圖
? ? ? ? //??.setNumber(number)?//設(shè)置通知集合的數(shù)量
? ? ? ?.setTicker("測(cè)試通知來啦")//通知首次出現(xiàn)在通知欄东跪,帶上升動(dòng)畫效果的
? ? ? ?.setWhen(System.currentTimeMillis())//通知產(chǎn)生的時(shí)間,會(huì)在通知信息里顯示鹰溜,一般是系統(tǒng)獲取到的時(shí)間
? ? ? ?.setPriority(Notification.PRIORITY_DEFAULT)//設(shè)置該通知優(yōu)先級(jí)
? ? ? ?//??.setAutoCancel(true)//設(shè)置這個(gè)標(biāo)志當(dāng)用戶單擊面板就可以讓通知將自動(dòng)取消
? ? ? .setOngoing(false)//ture虽填,設(shè)置他為一個(gè)正在進(jìn)行的通知。他們通常是用來表示一個(gè)后臺(tái)任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(shè)備(如一個(gè)文件下載,同步操作,主動(dòng)網(wǎng)絡(luò)連接)
? ? ? ?.setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加聲音曹动、閃燈和振動(dòng)效果的最簡(jiǎn)單斋日、最一致的方式是使用當(dāng)前的用戶默認(rèn)設(shè)置,使用defaults屬性墓陈,可以組合
? ? ? ? //Notification.DEFAULT_ALL??Notification.DEFAULT_SOUND?添加聲音?//?requires?VIBRATE?permission
? ? ? ?.setSmallIcon(R.drawable.ic_launcher);//設(shè)置通知小ICON
對(duì)應(yīng)的各個(gè)方法的屬性(部分方法以上代碼中已經(jīng)作注釋恶守,就不再介紹):
(1)方法:設(shè)置提醒標(biāo)志符Flags
功能:提醒標(biāo)志符第献,向通知添加聲音、閃燈和振動(dòng)效果等設(shè)置達(dá)到通知提醒效果兔港,可以組合多個(gè)屬性
有2種設(shè)置方法:
1.實(shí)例化通知欄之后通過給他添加.flags屬性賦值庸毫。
Notification?notification?=?mBuilder.build();
notification.flags?=?Notification.FLAG_AUTO_CANCEL;
2.通過setContentIntent(PendingIntentintent)方法中的意圖設(shè)置對(duì)應(yīng)的flags
publicPendingIntent?getDefalutIntent(intflags){
? ? ? ? PendingIntent?pendingIntent=?PendingIntent.getActivity(this,1,newIntent(),?flags);
? ? ? ? ?return pendingIntent;
}
提醒標(biāo)志符成員:
Notification.FLAG_SHOW_LIGHTS ? ? ? ? ? ? ?//三色燈提醒,在使用三色燈提醒時(shí)候必須加該標(biāo)志符
Notification.FLAG_ONGOING_EVENT ? ? ? ? ?//發(fā)起正在運(yùn)行事件(活動(dòng)中)
Notification.FLAG_INSISTENT//讓聲音衫樊、振動(dòng)無限循環(huán)飒赃,直到用戶響應(yīng)(取消或者打開)
Notification.FLAG_ONLY_ALERT_ONCE//發(fā)起Notification后,鈴聲和震動(dòng)均只執(zhí)行一次
Notification.FLAG_AUTO_CANCEL ? ? ?//用戶單擊通知后自動(dòng)消失
Notification.FLAG_NO_CLEAR ? ? ? ? ?//只有全部清除時(shí)科侈,Notification才會(huì)清除载佳,不清楚該通知(QQ的通知無法清除,就是用的這個(gè))
Notification.FLAG_FOREGROUND_SERVICE ? ?//表示正在運(yùn)行的服務(wù)
(2)方法:.setDefaults(int defaults) ? ? (NotificationCompat.Builder中的方法兑徘,用于提示)
功能:向通知添加聲音刚盈、閃燈和振動(dòng)效果的最簡(jiǎn)單、使用默認(rèn)(defaults)屬性挂脑,可以組合多個(gè)屬性(和方法1中提示效果一樣的)
對(duì)應(yīng)屬性:
Notification.DEFAULT_VIBRATE ? ?//添加默認(rèn)震動(dòng)提醒 ?需要 VIBRATE permission
Notification.DEFAULT_SOUND ? ?//?添加默認(rèn)聲音提醒
Notification.DEFAULT_LIGHTS//?添加默認(rèn)三色燈提醒
Notification.DEFAULT_ALL//?添加默認(rèn)以上3種全部提醒
(3)方法:setVibrate(long[] pattern)
功能:設(shè)置震動(dòng)方式藕漱。
使用:
.setVibrate(newlong[]?{0,300,500,700});
實(shí)現(xiàn)效果:延遲0ms,然后振動(dòng)300ms崭闲,在延遲500ms肋联,接著在振動(dòng)700ms。
以上方法的還有種寫法是
mBuilder.build().vibrate?=newlong[]?{0,300,500,700};
以此類推刁俭,2種寫法都可以橄仍。
如果希望設(shè)置默認(rèn)振動(dòng)方式,設(shè)置了方法(2)中默認(rèn)為DEFAULT_VIBRATE 即可牍戚。
(4)方法:.setLights(intledARGB,intledOnMS,intledOffMS)
功能:android支持三色燈提醒侮繁,這個(gè)方法就是設(shè)置不同場(chǎng)景下的不同顏色的燈。
描述:其中l(wèi)edARGB 表示燈光顏色如孝、?ledOnMS 亮持續(xù)時(shí)間宪哩、ledOffMS 暗的時(shí)間。
注意:1)只有在設(shè)置了標(biāo)志符Flags為Notification.FLAG_SHOW_LIGHTS的時(shí)候第晰,才支持三色燈提醒锁孟。
2)這邊的顏色跟設(shè)備有關(guān),不是所有的顏色都可以茁瘦,要看具體設(shè)備品抽。
使用:
.setLights(0xff0000ff,300,0)
同理,以下方法也可以設(shè)置同樣效果:
Notification?notify?=?mBuilder.build();
notify.flags?=?Notification.FLAG_SHOW_LIGHTS;
notify.ledARGB?=0xff0000ff;
notify.ledOnMS?=300;
notify.ledOffMS?=300;
如果希望使用默認(rèn)的三色燈提醒甜熔,設(shè)置了方法(2)中默認(rèn)為DEFAULT_LIGHTS即可圆恤。
(5)方法:.setSound(Urisound)
功能:設(shè)置默認(rèn)或則自定義的鈴聲,來提醒纺非。
//獲取默認(rèn)鈴聲
.setDefaults(Notification.DEFAULT_SOUND)
//獲取自定義鈴聲
.setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
//獲取Android多媒體庫(kù)內(nèi)的鈴聲
.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"5"))
同理相同效果的另一種設(shè)置方法這邊就不講哑了, 和上面的都是一樣的赘方。
(6)方法:.setPriority(int pri)
功能:設(shè)置優(yōu)先級(jí)
對(duì)應(yīng)優(yōu)先級(jí)描述如下圖:
對(duì)應(yīng)屬性(作用看上圖就可知道):
Notification.PRIORITY_DEFAULT
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOW
Notification.PRIORITY_MAX
Notification.PRIORITY_MIN
(7)方法:setOngoing(boolean ongoing)
功能:設(shè)置為ture,表示它為一個(gè)正在進(jìn)行的通知弱左。他們通常是用來表示一個(gè)后臺(tái)任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(shè)備(如一個(gè)文件下載,同步操作,主動(dòng)網(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)度的時(shí)候在此發(fā)起通知更新progress颈抚,并且在下載完成后要移除進(jìn)度條,通過調(diào)用setProgress(0, 0, false)既可嚼鹉。
如果為不確定(持續(xù)活動(dòng))的進(jìn)度條贩汉,這是在處理進(jìn)度無法準(zhǔn)確獲知時(shí)顯示活動(dòng)正在持續(xù),所以調(diào)用setProgress(0, 0, true)锚赤,操作結(jié)束時(shí)匹舞,調(diào)用setProgress(0, 0, false)并更新通知以移除指示條
第四步:設(shè)置通知欄PendingIntent(點(diǎn)擊動(dòng)作事件等都包含在這里)
在第三步中,沒有提到一個(gè)方法线脚,就是setContentIntent(PendingIntentintent)這個(gè)方法赐稽,這里拿到這里講。
知識(shí)點(diǎn)
1)什么是PendingIntent
PendingIntent和Intent略有不同浑侥,它可以設(shè)置執(zhí)行次數(shù)姊舵,主要用于遠(yuǎn)程服務(wù)通信、鬧鈴寓落、通知蠢莺、啟動(dòng)器、短信中零如,在一般情況下用的比較少。
2)PendingIntent什么用
Notification支持多種Intent來響應(yīng)單擊事件锄弱、消除事件考蕾、處理緊急狀態(tài)的全屏事件等。
這里就用到了setContentIntent(PendingIntentintent)來處理以上這么多的事件会宪。
3)相關(guān)屬性和方法
屬性:
PendingIntent的位標(biāo)識(shí)符:
FLAG_ONE_SHOT ? 表示返回的PendingIntent僅能執(zhí)行一次肖卧,執(zhí)行完后自動(dòng)取消
FLAG_NO_CREATE表示如果描述的PendingIntent不存在,并不創(chuàng)建相應(yīng)的PendingIntent掸鹅,而是返回NULL
FLAG_CANCEL_CURRENT表示相應(yīng)的PendingIntent已經(jīng)存在塞帐,則取消前者拦赠,然后創(chuàng)建新的PendingIntent,這個(gè)有利于數(shù)據(jù)保持為最新的葵姥,可以用于即時(shí)通信的通信場(chǎng)景
FLAG_UPDATE_CURRENT ? ? 表示更新的PendingIntent
方法:
可以看出荷鼠,它支持多種相應(yīng)方式,有Activity榔幸、Broadcast允乐、Service,就根據(jù)你自身需求去選擇削咆。
在各種情況下情況下它還會(huì)根據(jù)各種情況出發(fā)效果:
contentIntent:在通知窗口區(qū)域牍疏,Notification被單擊時(shí)的響應(yīng)事件由該intent觸發(fā);
deleteIntent:當(dāng)用戶點(diǎn)擊全部清除按鈕時(shí)拨齐,響應(yīng)該清除事件的Intent鳞陨;
fullScreenIntent:響應(yīng)緊急狀態(tài)的全屏事件(例如來電事件),也就是說通知來的時(shí)候瞻惋,跳過在通知區(qū)域點(diǎn)擊通知這一步厦滤,直接執(zhí)行fullScreenIntent代表的事件。
例如:在執(zhí)行了點(diǎn)擊通知之后要跳轉(zhuǎn)到指定的XXX的Activity的時(shí)候熟史,可以設(shè)置以下方法來相應(yīng)點(diǎn)擊事件:
Intent?intent?=newIntent(context,XXX.class);
PendingIntent?pendingIntent?=?PendingIntent.getActivity(context,0,?intent,0);
mBuilder.setContentIntent(pendingIntent)
例如:在執(zhí)行了清空全部的通知操作時(shí)候馁害,可以設(shè)置以下方法來相應(yīng)這個(gè)事件:
采用setDeleteIntent(PendingIntentintent)方法或按照以下寫法
Intent?deleteIntent?=newIntent();
deleteIntent.setClass(context,?XXXReceiver.class);
deleteIntent.setAction(DELETE_ACTION);
notification.deleteIntent?=?PendingIntent.getBroadcast(context,0,?deleteIntent,0);
例如:在響應(yīng)緊急事件(如來電)時(shí)候,可以設(shè)置以下方法來相應(yīng)這個(gè)事件:
采用setFullScreenIntent(PendingIntentintent, boolean highPriority)
第五步蹂匹,最簡(jiǎn)單的一部碘菜,發(fā)送通知請(qǐng)求
mNotificationManager.notify(notifyId,?mBuilder.build());
拓展
實(shí)現(xiàn)自定義的通知欄效果:
這里要用到RemoteViews這個(gè)類。實(shí)現(xiàn)以下2種自定義布局限寞。
注意:
Notification的自定義布局是RemoteViews忍啸,和其他RemoteViews一樣,在自定義視圖布局文件中履植,僅支持FrameLayout计雌、LinearLayout、RelativeLayout三種布局控件和AnalogClock玫霎、Chronometer凿滤、Button、ImageButton庶近、ImageView翁脆、ProgressBar、TextView鼻种、ViewFlipper反番、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件罢缸,不支持這些類的子類或Android提供的其他控件篙贸。否則會(huì)引起ClassNotFoundException異常
步驟如下:
1)創(chuàng)建自定義視圖
2)獲取遠(yuǎn)程視圖對(duì)象(注:Notification的contentView不能為空)
3)設(shè)置PendingIntent(來響應(yīng)各種事件)
4)發(fā)起Notification
大體4步驟這里就不詳細(xì)說了,下面就把DEMO中的列子拿出來說下
樣式:
1.自定義帶按鈕通知欄(如下樣式)
正在進(jìn)行的
“正在進(jìn)行的”通知使用戶了解正在運(yùn)行的后臺(tái)進(jìn)程枫疆。例如爵川,音樂播放器可以顯示正在播放的音樂。也可以用來顯示需要長(zhǎng)時(shí)間處理的操作养铸,例如下載或編碼視頻雁芙。“正在進(jìn)行的”通知不能被手動(dòng)刪除钞螟。
實(shí)現(xiàn)方法如下:
/**
*?帶按鈕的通知欄
*/
publicvoidshowButtonNotify(){
NotificationCompat.Builder?mBuilder?=newBuilder(this);
RemoteViews?mRemoteViews?=newRemoteViews(getPackageName(),?R.layout.view_custom_button);
mRemoteViews.setImageViewResource(R.id.custom_song_icon,?R.drawable.sing_icon);
//API3.0?以上的時(shí)候顯示按鈕兔甘,否則消失
mRemoteViews.setTextViewText(R.id.tv_custom_song_singer,"周杰倫");
mRemoteViews.setTextViewText(R.id.tv_custom_song_name,"七里香");
//如果版本號(hào)低于(3。0)鳞滨,那么不顯示按鈕
if(BaseTools.getSystemVersion()?<=9){
mRemoteViews.setViewVisibility(R.id.ll_custom_button,?View.GONE);
}else{
mRemoteViews.setViewVisibility(R.id.ll_custom_button,?View.VISIBLE);
}
//
if(isPlay){
mRemoteViews.setImageViewResource(R.id.btn_custom_play,?R.drawable.btn_pause);
}else{
mRemoteViews.setImageViewResource(R.id.btn_custom_play,?R.drawable.btn_play);
}
//點(diǎn)擊的事件處理
Intent?buttonIntent?=newIntent(ACTION_BUTTON);
/*?上一首按鈕?*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,?BUTTON_PREV_ID);
//這里加了廣播洞焙,所及INTENT的必須用getBroadcast方法
PendingIntent?intent_prev?=?PendingIntent.getBroadcast(this,1,?buttonIntent,?PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev,?intent_prev);
/*?播放/暫停??按鈕?*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,?BUTTON_PALY_ID);
PendingIntent?intent_paly?=?PendingIntent.getBroadcast(this,2,?buttonIntent,?PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play,?intent_paly);
/*?下一首?按鈕??*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,?BUTTON_NEXT_ID);
PendingIntent?intent_next?=?PendingIntent.getBroadcast(this,3,?buttonIntent,?PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_next,?intent_next);
mBuilder.setContent(mRemoteViews)
.setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))
.setWhen(System.currentTimeMillis())//?通知產(chǎn)生的時(shí)間,會(huì)在通知信息里顯示
.setTicker("正在播放")
.setPriority(Notification.PRIORITY_DEFAULT)//?設(shè)置該通知優(yōu)先級(jí)
.setOngoing(true)
.setSmallIcon(R.drawable.sing_icon);
Notification?notify?=?mBuilder.build();
notify.flags?=?Notification.FLAG_ONGOING_EVENT;
mNotificationManager.notify(notifyId,?notify);
}
注意:帶按鈕的布局相應(yīng)點(diǎn)擊事件在3.0以下版本沒有用拯啦,所以這邊作了系統(tǒng)版本判斷澡匪,來顯示消失按鈕。
2.自定義不帶按鈕通知欄
實(shí)現(xiàn)方法如下:
//先設(shè)定RemoteViews
RemoteViews?view_custom?=newRemoteViews(getPackageName(),?R.layout.view_custom);
//設(shè)置對(duì)應(yīng)IMAGEVIEW的ID的資源圖片
view_custom.setImageViewResource(R.id.custom_icon,?R.drawable.icon);
//??????view_custom.setInt(R.id.custom_icon,"setBackgroundResource",R.drawable.icon);
view_custom.setTextViewText(R.id.tv_custom_title,"今日頭條");
view_custom.setTextViewText(R.id.tv_custom_content,"金州勇士官方宣布球隊(duì)已經(jīng)解雇了主帥馬克-杰克遜褒链,隨后宣布了最后的結(jié)果唁情。");
之后調(diào)用:
mBuilder.setContent(view_custom)
來設(shè)定自定義的這個(gè)布局。
實(shí)現(xiàn):大視圖風(fēng)格通知(注:4.1之前的版本不支持大視圖)
只在通知被展開時(shí)顯示
何時(shí)展開:通知處在頂端甫匹,或者用戶通過收拾展開
收件箱風(fēng)格的通知:
相比普通視圖甸鸟,只多出:7. 詳情區(qū)域
效果圖如下:
詳情區(qū)域根據(jù)用途可有多種風(fēng)格:
1.NotificationCompat.BigPictureStyle?大圖片風(fēng)格:詳情區(qū)域包含一個(gè)256dp高度的位圖
2.NotificationCompat.BigTextStyle大文字風(fēng)格:顯示一個(gè)大的文字塊
3.NotificationCompat.InboxStyle ?收件箱風(fēng)格:顯示多行文字
各種風(fēng)格都具有以下常規(guī)視圖不具有的內(nèi)容選項(xiàng):
1.大標(biāo)題:在展開視圖時(shí)替代普通視圖的標(biāo)記
2.總結(jié)文字:允許你在詳情區(qū)域之下增加一行內(nèi)容
拿收件箱風(fēng)格為例,實(shí)現(xiàn)代碼如下:
NotificationCompat.BigPictureStyle?inboxStyle?=newNotificationCompat.InboxStyle();
String[]?events?=newString[5];
//?Sets?a?title?for?the?Inbox?style?big?view
inboxStyle.setBigContentTitle("大視圖內(nèi)容:");
//?Moves?events?into?the?big?view
for(inti=0;?i?<?events.length;?i++)?{
inboxStyle.addLine(events[i]);
}
mBuilder.setContentTitle("測(cè)試標(biāo)題")
.setContentText("測(cè)試內(nèi)容")
//??????????????.setNumber(number)//顯示數(shù)量
.setStyle(inboxStyle)//設(shè)置風(fēng)格
.setTicker("測(cè)試通知來啦");
開發(fā)中碰到的問題
(注:下面所指的低版本是指2.3及2.3以下版本)
1.如何取消掉通知欄上的通知
(1)設(shè)置對(duì)應(yīng)的flags兵迅,讓用戶點(diǎn)擊既被消除:
notification.flags = FLAG_AUTO_CANCEL;
(2) 通過手動(dòng)消除某項(xiàng)或則全部通知
mNotificationMgr.cancle(NOTIFICATION_ID);//消除對(duì)應(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)建一個(gè)通知類刻恭。
3.低版本中會(huì)報(bào)的錯(cuò)誤及解決方案:
(1)錯(cuò)誤代碼:java.lang.IllegalArgumentException: contentIntent required: pkg=com.example.notifications id=100 notification=Notification(vibrate=default,sound=null,defaults=0x2,flags=0x0)
解決方案:如果在高版本不會(huì)出錯(cuò),而在2.3上面報(bào)了這個(gè)錯(cuò)誤扯夭,通過開發(fā)文檔中的以下知道你可以找打:
For this reason, you should always ensure that UI controls in a notification are also available in anActivityin your app, and you should always start thatActivitywhen users click the notification. To do this, use thesetContentIntent()method.
你就應(yīng)該知道鳍贾,缺少了setContentIntent()這個(gè)方法,在2.3及更低的版本中交洗,必須給它設(shè)置設(shè)置contentIntent贾漏,如果你點(diǎn)擊沒有意圖,可以在賦值的的Intent中設(shè)置為new Intent()既可藕筋,切記contentIntent不能為空。
代碼如下:
publicPendingIntent?getDefalutIntent(intflags){
? ? ? ? ?PendingIntent?pendingIntent=?PendingIntent.getActivity(this,1,newIntent(),?flags);
? ? ? ? ?return pendingIntent;
}
(2)錯(cuò)誤代碼: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))
解決方法:
在自定義的時(shí)候,發(fā)現(xiàn)了這個(gè)問題隐圾,解決:每次更新時(shí)都必須把RemoteViews給new出來才行伍掀,不能利用已有的notification.contentView直接操作!
4.低版本中暇藏,自定義的通知欄中如果帶有按鈕蜜笤,可能按鈕點(diǎn)擊事件會(huì)失靈
解決方法:看其它的應(yīng)用,好像在低版本都會(huì)隱藏掉那些按鈕盐碱,就是為了不影響用戶體驗(yàn)把兔,所以應(yīng)該就這么解決,判斷版本號(hào)在去決定是否現(xiàn)在按鈕瓮顽。
5.低版本中县好,自定義布局中的字體顏色看不清
如右圖:
解決方案:
由于2.3及之前版本,背景設(shè)是白色的那我們定義字體顏色為系統(tǒng)預(yù)設(shè)的顏色:
?android:attr/textColorPrimary
在資源的src/values目錄中的style.xml文件中設(shè)置它標(biāo)題和內(nèi)容的樣式為:
在2.3之后的版本中(即API >=9的版本中)暖混,在資源文件下的src/values-v9目錄中的style.xml文件中設(shè)置它標(biāo)題和內(nèi)容的樣式為:
最后賦給自定義布局中的對(duì)應(yīng)標(biāo)題和內(nèi)容對(duì)應(yīng)的style即可缕贡。
對(duì)應(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.自定義布局的時(shí)候,不同版本方法不一樣贮配。(弄了半天谍倦,在2.3版本不顯示,原來是方法不兼容)
2.3及2.3之前:
通過
Notification?notify?=?mBuilder.build();
notify.contentView?=?view_custom;
mNotificationManager.notify(notifyId,?notify)
方法賦予VIEW泪勒。
2.3之后:
通過Builder以下方法賦于自定義布局昼蛀。
mBuilder.setContent(view_custom)
DEMO截圖:
DEMO下載:下載地址