通知欄Notification的詳細(xì)使用

轉(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下載:下載地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酣藻,隨后出現(xiàn)的幾起案子曹洽,更是在濱河造成了極大的恐慌,老刑警劉巖辽剧,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送淆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怕轿,警方通過查閱死者的電腦和手機(jī)偷崩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撞羽,“玉大人阐斜,你說我怎么就攤上這事【魑桑” “怎么了谒出?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我笤喳,道長(zhǎng)为居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任杀狡,我火速辦了婚禮蒙畴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呜象。我一直安慰自己膳凝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布恭陡。 她就那樣靜靜地躺著蹬音,像睡著了一般。 火紅的嫁衣襯著肌膚如雪子姜。 梳的紋絲不亂的頭發(fā)上祟绊,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音哥捕,去河邊找鬼牧抽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遥赚,可吹牛的內(nèi)容都是我干的扬舒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼凫佛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼讲坎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愧薛,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤晨炕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后毫炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓮栗,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瞄勾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了费奸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡进陡,死狀恐怖愿阐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趾疚,我是刑警寧澤缨历,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布以蕴,位于F島的核電站,受9級(jí)特大地震影響戈二,放射性物質(zhì)發(fā)生泄漏舒裤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一觉吭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仆邓,春花似錦鲜滩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搞疗,卻和暖如春嗓蘑,著一層夾襖步出監(jiān)牢的瞬間敷待,已是汗流浹背猛拴。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留验游,地道東北人幢炸。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓泄隔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宛徊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佛嬉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 原文出處: http://www.androidchina.net/6174.html Notification在...
    木木00閱讀 12,296評(píng)論 3 32
  • 通知(Notification)這個(gè)功能對(duì)于我們來說非常的常見。打開手機(jī)的時(shí)候闸天,各種軟件的推送消息蜂擁而至暖呕,然后我...
    憶念成風(fēng)閱讀 3,310評(píng)論 2 10
  • 基本使用 1.獲取 NotificationManager 實(shí)例2.實(shí)例化 NotificationCompat....
    不需要任何閱讀 860評(píng)論 0 7
  • Notification簡(jiǎn)介 通知是在常規(guī)UI界面之外向用戶展示消息的工具,當(dāng)系統(tǒng)發(fā)出通知時(shí)苞氮,它會(huì)以圖表的形式顯示...
    Cris_Ma閱讀 6,884評(píng)論 2 10
  • 楊戩拉過敖寸心的手掌仔細(xì)看了一遍湾揽,一抬頭就對(duì)上敖寸心得意洋洋的表情:“你悟出來了?”楊戩的聲音也透著驚喜葱淳,他是知道...
    輕映閱讀 566評(píng)論 0 0