android Notification 的使用

最近一直在研究 android ,并一邊研究一邊做應(yīng)用松却。其中遇到了把程序通知常駐在 Notification 欄,并且不能被 clear 掉(就像android QQ一樣)的問(wèn)題溅话。經(jīng)過(guò)研究實(shí)現(xiàn)了其功能晓锻,現(xiàn)把 Notification 的使用總結(jié)如下:

Notification 的使用需要導(dǎo)入 3 個(gè)類

import android.app.PendingIntent;
import android.app.NotificationManager;
import android.app.Notification;

代碼示例及說(shuō)明

NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);   
Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis()); 
n.flags = Notification.FLAG_AUTO_CANCEL;
Intent i = new Intent(arg0.getContext(), NotificationShow.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);   
//PendingIntent
PendingIntent contentIntent = PendingIntent.getActivity(
arg0.getContext(), 
R.string.app_name, 
i, 
PendingIntent.FLAG_UPDATE_CURRENT);
 
n.setLatestEventInfo(
arg0.getContext(),
"Hello,there!", 
"Hello,there,I'm john.", 
contentIntent);
nm.notify(R.string.app_name, n);

下面依次對(duì)每一段代碼進(jìn)行分析:

NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

創(chuàng)建 NotificationManager,其中創(chuàng)建的 nm 對(duì)象負(fù)責(zé)“發(fā)出”與“取消” Notification飞几。

Notification n = new Notification(R.drawable.chat, "Hello,there!", System.currentTimeMillis()); 
n.flags = Notification.FLAG_ONGOING_EVENT;  

創(chuàng)建 Notification 砚哆,參數(shù)依次為:icon的資源id,在狀態(tài)欄上展示的滾動(dòng)信息屑墨,時(shí)間躁锁。其中創(chuàng)建的 n 對(duì)象用來(lái)描述出現(xiàn)在系統(tǒng)通知欄的信息纷铣,之后我們將會(huì)看到會(huì)在 n 對(duì)象上設(shè)置點(diǎn)擊此條通知發(fā)出的Intent。

n.flags = Notification.FLAG_AUTO_CANCEL;

設(shè)置 n.flags 為 Notification.FLAG_AUTO_CANCEL 战转,該標(biāo)志表示當(dāng)用戶點(diǎn)擊 Clear 之后搜立,能夠清除該通知。

Intent i = new Intent(arg0.getContext(), NotificationShow.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

創(chuàng)建一個(gè)Intent槐秧,該Intent使得當(dāng)用戶點(diǎn)擊該通知后發(fā)出這個(gè)Intent
請(qǐng)注意啄踊,如果要以該Intent啟動(dòng)一個(gè)Activity,一定要設(shè)置 Intent.FLAG_ACTIVITY_NEW_TASK 標(biāo)記刁标。
Intent.FLAG_ACTIVITY_CLEAR_TOP :如果在當(dāng)前Task中颠通,有要啟動(dòng)的Activity,那么把該Acitivity之前的所有Activity都關(guān)掉命雀,并把此Activity置前以避免創(chuàng)建Activity的實(shí)例
Intent.FLAG_ACTIVITY_NEW_TASK :系統(tǒng)會(huì)檢查當(dāng)前所有已創(chuàng)建的Task中是否有該要啟動(dòng)的Activity的Task蒜哀,若有,則在該Task上創(chuàng)建Activity吏砂,若沒(méi)有則新建具有該Activity屬性的Task,并在該新建的Task上創(chuàng)建Activity乘客。

PendingIntent contentIntent = PendingIntent.getActivity(
arg0.getContext(), 
R.string.app_name, 
i, 
PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent 為Intent的包裝狐血,這里是啟動(dòng)Intent的描述,PendingIntent.getActivity 返回的PendingIntent表示易核,此PendingIntent實(shí)例中的Intent是用于啟動(dòng) Activity 的Intent匈织。PendingIntent.getActivity的參數(shù)依次為:Context,發(fā)送者的請(qǐng)求碼(可以填0)牡直,用于系統(tǒng)發(fā)送的Intent缀匕,標(biāo)志位。
其中 PendingIntent.FLAG_UPDATE_CURRENT 表示如果該描述的PendingIntent已存在碰逸,則改變已存在的PendingIntent的Extra數(shù)據(jù)為新的PendingIntent的Extra數(shù)據(jù)乡小。
這里再簡(jiǎn)要說(shuō)一下 Intent 與 PendingIntent 的區(qū)別:
Intent :意圖,即告訴系統(tǒng)我要干什么饵史,然后系統(tǒng)根據(jù)這個(gè)Intent做對(duì)應(yīng)的事满钟。如startActivity相當(dāng)于發(fā)送消息,而Intent是消息的內(nèi)容胳喷。
PendingIntent :包裝Intent湃番,Intent 是我們直接使用 startActivity , startService 或 sendBroadcast 啟動(dòng)某項(xiàng)工作的意圖吭露。而某些時(shí)候吠撮,我們并不能直接調(diào)用startActivity , startServide 或 sendBroadcast 讲竿,而是當(dāng)程序或系統(tǒng)達(dá)到某一條件才發(fā)送Intent泥兰。如這里的Notification择浊,當(dāng)用戶點(diǎn)擊Notification之后,由系統(tǒng)發(fā)出一條Activity 的 Intent 逾条。因此如果我們不用某種方法來(lái)告訴系統(tǒng)的話琢岩,系統(tǒng)是不知道是使用 startActivity ,startService 還是 sendBroadcast 來(lái)啟動(dòng)Intent 的(當(dāng)然還有其他的“描述”)师脂,因此這里便需要PendingIntent担孔。

n.setLatestEventInfo(
arg0.getContext(),
"Hello,there!", 
"Hello,there,I'm john.", 
contentIntent);

設(shè)置顯示在通知下拉框中的信息吃警,參數(shù)依次為:Context糕篇,標(biāo)題,內(nèi)容酌心,PendingIntent拌消。
1

nm.notify(R.string.app_name, n);

啟動(dòng)Notification,參數(shù)依次為:在你的程序中標(biāo)識(shí)Notification的id值(用來(lái)區(qū)分同一程序中的不同Notifycation安券,如果程序中只有一個(gè)Notification那么這里隨便你填什么都可以墩崩,不過(guò)類型必須要為int),要通知的Notification侯勉。
如何使自己的Notification像Android QQ一樣能出現(xiàn)在 “正在運(yùn)行的”欄目下面
其實(shí)很簡(jiǎn)單鹦筹,只需設(shè)置Notification.flags = Notification.FLAG_ONGOING_EVENT;便可以了。
如何改變 Notification 在“正在運(yùn)行的”欄目下面的布局
創(chuàng)建 RemoteViews 并賦給 Notification.contentView 址貌,再把 PendingIntent 賦給 Notification.contentIntent 便可以了铐拐,如:

PendingIntent contentIntent = PendingIntent.getActivity(
arg0.getContext(), 
R.string.app_name,
i, 
PendingIntent.FLAG_UPDATE_CURRENT);
 
RemoteViews rv = new RemoteViews(Main.this.getPackageName(), R.layout.notification_view);
rv.setImageViewResource(R.id.image, R.drawable.chat);
rv.setTextViewText(R.id.text, "Hello,there,I'm john.");
n.contentView = rv;
n.contentIntent = contentIntent;
 
nm.notify(R.string.app_name, n);

注意,如果使用了contentView练对,那么便不要使用Notification.setLatestEventInfo遍蟋。如果setLatestEventInfo在賦給 Notification.contentView 的代碼之后,那么contentView的效果將被覆蓋螟凭,顯示的便是 setLatestEventInfo 的效果虚青;如果 setLatestEventInfo 在 Notification.contentView 的代碼之前,那么顯示的便是 Notification.contentView 的效果赂摆,也就是說(shuō)不管你想要setLatestEventInfo 或 contentView 的自定義效果挟憔,請(qǐng)保證始終只有一句設(shè)置代碼,因?yàn)樵谧詈笠痪浣壎ǖ臅r(shí)候烟号,之前的設(shè)置contentView或setLatestEventInfo的代碼都是完全沒(méi)有必要的绊谭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市汪拥,隨后出現(xiàn)的幾起案子达传,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宪赶,死亡現(xiàn)場(chǎng)離奇詭異宗弯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搂妻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蒙保,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人欲主,你說(shuō)我怎么就攤上這事邓厕。” “怎么了扁瓢?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵详恼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我引几,道長(zhǎng)昧互,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任伟桅,我火速辦了婚禮敞掘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贿讹。我一直安慰自己渐逃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布民褂。 她就那樣靜靜地躺著,像睡著了一般疯潭。 火紅的嫁衣襯著肌膚如雪赊堪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天竖哩,我揣著相機(jī)與錄音哭廉,去河邊找鬼。 笑死相叁,一個(gè)胖子當(dāng)著我的面吹牛遵绰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播增淹,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椿访,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了虑润?” 一聲冷哼從身側(cè)響起成玫,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后哭当,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猪腕,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年钦勘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陋葡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻采,死狀恐怖腐缤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颊亮,我是刑警寧澤柴梆,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站终惑,受9級(jí)特大地震影響绍在,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雹有,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一偿渡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霸奕,春花似錦溜宽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至煤惩,卻和暖如春嫉嘀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魄揉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工剪侮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洛退。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓瓣俯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親兵怯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彩匕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • NotificationManager mNotificationManager= (NotificationMa...
    木卯卯閱讀 1,294評(píng)論 0 3
  • 原文出處: http://www.androidchina.net/6174.html Notification在...
    木木00閱讀 12,328評(píng)論 3 32
  • 愛(ài)一個(gè)人需要表達(dá),不管是結(jié)婚前后摇零。如果戀愛(ài)時(shí)都表現(xiàn)不積極推掸,結(jié)婚這個(gè)話題就可以不用聊了桶蝎。 首先最重要的一點(diǎn)是,對(duì)ta...
    小鹿的快樂(lè)園閱讀 388評(píng)論 4 3
  • 前天周六谅畅,本來(lái)可以加班登渣,卻臨時(shí)通知取消上班,心情瞬間跌到了低谷毡泻,可愛(ài)的加班費(fèi)就這么擦肩而過(guò)胜茧,對(duì)于愛(ài)錢的我來(lái)說(shuō)...
    傳灝閱讀 413評(píng)論 4 2
  • 嘯暘_閱讀 296評(píng)論 0 0