通知Notification的簡單使用

均屬于筆記,僅供個人參考糕篇,有問題歡迎指正啄育,整理模式

一,通知的基本應用

通知的用法還是比較靈活的拌消,既可以在活動里創(chuàng)建挑豌,也可以在廣播接收器里創(chuàng)建,當然還可以在服務里創(chuàng)建墩崩。相比于廣播接收器和服務氓英,在活動里創(chuàng)建通知的場景還是比較少的,因為一般只有當程序進入到后臺的時候我們才需要使用通知泰鸡。

1债蓝,獲取通知管理器

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

2,創(chuàng)建通知對象

Notification notification = new Notification(R.drawable.icon, "This is ticker text",System.currentTimeMillis());

Notification 的有參構(gòu)造函數(shù)接收三個參數(shù)盛龄,第一個參數(shù)用于指定通知的圖標饰迹,比如項目的res/drawable 目錄下有一張icon.png 圖片芳誓,那么這里就可以傳入R.drawable.icon。第二個參數(shù)用于指定通知的ticker 內(nèi)容啊鸭,當通知剛被創(chuàng)建的時候锹淌,它會在系統(tǒng)的狀態(tài)欄一閃而過,屬于一種瞬時的提示信息赠制。第三個參數(shù)用于指定通知被創(chuàng)建的時間赂摆,以毫秒為單位,當下拉系統(tǒng)狀態(tài)欄時钟些,這里指定的時間會顯示在相應的通知上烟号。

3,設置通知的布局

notification.setLatestEventInfo(context, "This is content title", "This iscontent text", null);

這個方法接收四個參數(shù)政恍,第一個參數(shù)是Context汪拥,這個沒什么好解釋的。第二個參數(shù)用于指定通知的標題內(nèi)容篙耗,下拉系統(tǒng)狀態(tài)欄就可以看到這部分內(nèi)容迫筑。第三個參數(shù)用于指定通知的正文內(nèi)容,同樣下拉系統(tǒng)狀態(tài)欄就可以看到這部分內(nèi)容宗弯。第四個參數(shù)是一個PendingIntent對象脯燃,這里我們暫時還用不到,可以先傳入null蒙保。

4辕棚,發(fā)布通知

manager.notify(1, notification);

notify()方法接收兩個參數(shù),第一個參數(shù)是id邓厕,要保證為每個通知所指定的id 都是不同的坟募。第二個參數(shù)則是Notification 對象,這里直接將我們剛剛創(chuàng)建好的Notification 對象傳入即可邑狸。

二,不同版本的構(gòu)建方式:

在不同的版本下Notification使用有一些不同涤妒,涉及到改成Builder的使用单雾,現(xiàn)在網(wǎng)上大多數(shù)資料還是API Level 11版本前的用法介紹,如果不熟悉的話她紫,會繞一些彎路硅堆。

現(xiàn)在總結(jié)如下,希望對以后使用的程序員有所幫助贿讹。

1渐逃,低于API Level 11版本,也就是Android 2.3.3以下的系統(tǒng)中民褂,setLatestEventInfo()函數(shù)是唯一的實現(xiàn)方法茄菊。前面的有關(guān)屬性設置這里就不再提了疯潭,網(wǎng)上資料很多。

Intent? intent = new Intent(this,MainActivity);?

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);?

notification.setLatestEventInfo(context, title, message, pendingIntent);? ? ? ? ?

manager.notify(id, notification);?

2面殖,高于API Level 11竖哩,低于API Level 16 (Android 4.1.2)版本的系統(tǒng)中,可使用Notification.Builder來構(gòu)造函數(shù)脊僚。但要使用getNotification()來使notification實現(xiàn)相叁。此時,前面版本在notification中設置的Flags辽幌,icon等屬性都已經(jīng)無效增淹,要在builder里面設置。

Notification.Builder builder = new Notification.Builder(context)?

? ? ? ? ? ? .setAutoCancel(true)?

? ? ? ? ? ? .setContentTitle("title")?

? ? ? ? ? ? .setContentText("describe")?

? ? ? ? ? ? .setContentIntent(pendingIntent)?

? ? ? ? ? ? .setSmallIcon(R.drawable.ic_launcher)?

? ? ? ? ? ? .setWhen(System.currentTimeMillis())?

? ? ? ? ? ? .setOngoing(true);?

notification=builder.getNotification();?

3乌企,高于API Level 16的版本虑润,就可以用Builder和build()函數(shù)來配套的方便使用notification了。

Notification notification = new Notification.Builder(context)? ?

? ? ? ? .setAutoCancel(true)? ?

? ? ? ? .setContentTitle("title")? ?

? ? ? ? .setContentText("describe")? ?

? ? ? ? .setContentIntent(pendingIntent)? ?

? ? ? ? .setSmallIcon(R.drawable.ic_launcher)? ?

? ? ? ? .setWhen(System.currentTimeMillis())? ?

? ? ? ? .build();?

4逛犹,注意點

在構(gòu)造notification的時候有很多種寫法端辱,但是要注意,用Notification notification = new Notification();這種構(gòu)建方法的時候虽画,一定要加上notification.icon這個設置舞蔽,不然,程序雖然不會報錯码撰,但是會沒有效果渗柿。

三,PendingIntent的介紹

PendingIntent 從名字上看起來就和Intent 有些類似脖岛,它們之間也確實存在著不少共同點朵栖。比如它們都可以去指明某一個“意圖”,都可以用于啟動活動柴梆、啟動服務以及發(fā)送廣播等陨溅。不同的是,Intent 更加傾向于去立即執(zhí)行某個動作绍在,而PendingIntent 更加傾向于在某個合適的時機去執(zhí)行某個動作门扇。所以,也可以把PendingIntent 簡單地理解為延遲執(zhí)行的Intent偿渡。

獲取的方法:

public static PendingIntent getActivity(Context context, int requestCode,Intent intent, int flags)

public static PendingIntent getBroadcast(Context context, int requestCodeIntent intent, int flags)

public static PendingIntent getService(Context context, int requestCode,Intent intent, int flags)

參數(shù)介紹:

PendingIntent 的用法同樣很簡單臼寄,它主要提供了幾個靜態(tài)方法用于獲取PendingIntent 的實例,可以根據(jù)需求來選擇是使用getActivity()方法溜宽、getBroadcast()方法吉拳、還是getService()方法。這幾個方法所接收的參數(shù)都是相同的适揉,第一個參數(shù)依舊是Context留攒,不用多做解釋煤惩。第二個參數(shù)一般用不到,通常都是傳入0 即可稼跳。第三個參數(shù)是一個Intent 對象盟庞,我們可以通過這個對象構(gòu)建出PendingIntent 的“意圖”。第四個參數(shù)用于確定PendingIntent 的行為汤善,有FLAG_ONE_SHOT什猖、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和FLAG_UPDATE_CURRENT 這四種值可選红淡。

FLAG_ONE_SHOT:利用 FLAG_ONE_SHOT獲取的PendingIntent只能使用一次不狮,即使再次利用上面三個方法重新獲取,再使用PendingIntent也將失敗在旱。

FLAG_NO_CREATE:利用FLAG_NO_CREAT獲取的PendingIntent摇零,若描述的Intent不存在則返回NULL值.

FLAG_CANCEL_CURRENT:如果描述的PendingIntent已經(jīng)存在,則在產(chǎn)生新的Intent之前會先取消掉當前的桶蝎。你可用使用它去檢索新的Intent驻仅,如果你只是想改變Intent中的額外數(shù)據(jù)的話。通過取消先前的Intent登渣,可用確保只有最新的實體可用啟動它噪服。

FLAG_UPDATE_CURRENT:最經(jīng)常使用的是FLAG_UPDATE_CURRENT,因為描述的Intent有 更新的時候需要用到這個flag去更新你的描述胜茧,否則組件在下次事件發(fā)生或時間到達的時候extras永遠是第一次Intent的extras粘优。

此外還需要注意參數(shù): int requestCode :對于FLAG_UPDATE_CURRENT,如果上面的requestCode 為常量,則對于先后出現(xiàn)的若干Notification,則所有對應的Intent里面的extra被更新為最新的呻顽,就是全部同一為最后一次的雹顺。相反,如果requestCode 每次不一樣廊遍,則里面的Inent的數(shù)據(jù)沒被更新嬉愧。

例如:

FLAG_UPDATE_CURRENT會更新之前PendingIntent的消息,比如喉前,你推送了消息1英染,并在其中的Intent中putExtra了一個值“ABC”,在未點擊該消息前被饿,繼續(xù)推送第二條消息,并在其中的Intent中putExtra了一個值“CBA”搪搏,好了狭握,這時候,如果你單擊消息1或者消息2疯溺,你會發(fā)現(xiàn)论颅,他倆個的Intent中讀取過來的信息都是“CBA”哎垦,就是說,第二個替換了

第一個的內(nèi)容當使用FLAG_CANCEL_CURRENT時:

依然是上面的操作步驟恃疯,這時候會發(fā)現(xiàn)漏设,點擊消息1時,沒反應今妄,第二條可以點擊郑口。

導致上面兩個問題的原因就在于第二個參數(shù)requestCode,當requestCode值一樣時盾鳞,后面的就會對之前的消息起作用犬性,所以為了避免影響之前的消息,requestCode每次要設置不同的內(nèi)容腾仅。

參考:http://blog.sina.com.cn/s/blog_5da93c8f01011w5j.html

http://blog.csdn.net/bdmh/article/details/41804695

四乒裆,通知的高級技巧

可以在通知到來的時候使用音樂、震動和LED顯示燈提醒用戶推励。常用的個人感覺還是震動

1鹤耍,使用音頻

先來看看sound這個屬性吧,它可以在通知發(fā)出的時候播放一段音頻验辞,這樣就能夠更好地告知用戶有通知到來稿黄。sound 這個屬性是一個Uri 對象,所以在指定音頻文件的時候還需要先獲取到音頻文件對應的URI受神。比如說抛猖,我們手機的/system/media/audio/ringtones 目錄下有一個Basic_tone.ogg音頻文件,那么在代碼中這樣就可以這樣指定:

Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/Basic_tone.ogg"));

notification.sound = soundUri;

2,使用振動

在通知到來的時候讓手機進行振動鼻听,使用的是vibrate這個屬性财著。它是一個長整型的數(shù)組,用于設置手機靜止和振動的時長撑碴,以毫秒為單位撑教。下標為0 的值表示手機靜止的時長,下標為1 的值表示手機振動的時長醉拓,下標為2 的值又表示手機靜止的時長伟姐,以此類推。所以亿卤,如果想要讓手機在通知到來的時候立刻振動1 秒愤兵,然后靜止1 秒,再振動1 秒排吴,代碼就可以寫成:

long[] vibrates = {0, 1000, 1000, 1000};

notification.vibrate = vibrates;

不過秆乳,想要控制手機振動還需要聲明權(quán)限的。因此,我們還得編輯AndroidManifest.xml文件屹堰,加入如下聲明:

<uses-permission android:name="android.permission.VIBRATE" />

3,使用LED燈

現(xiàn)在的手機基本上都會前置一個LED 燈肛冶,當有未接電話或未讀短信,而此時手機又處于鎖屏狀態(tài)時扯键,LED 燈就會不停地閃爍睦袖,提醒用戶去查看。我們可以使用ledARGB荣刑、ledOnMS馅笙、ledOffMS 以及flags 這幾個屬性來實現(xiàn)這種效果。ledARGB 用于控制LED 燈的顏色嘶摊,一般有紅綠藍三種顏色可選延蟹。ledOnMS 用于指定LED 燈亮起的時長,以毫秒為單位叶堆。ledOffMS用于指定LED 燈暗去的時長阱飘,也是以毫秒為單位。flags 可用于指定通知的一些行為虱颗,其中就包括顯示LED 燈這一選項沥匈。所以,當通知到來時忘渔,如果想要實現(xiàn)LED 燈以綠色的燈光一閃一閃的效果高帖,就可以寫成:

notification.ledARGB = Color.GREEN;

notification.ledOnMS = 1000;

notification.ledOffMS = 1000;

notification.flags = Notification.FLAG_SHOW_LIGHTS;

當然,如果你不想進行那么多繁雜的設置畦粮,也可以直接使用通知的默認效果散址,它會根據(jù)當前手機的環(huán)境來決定播放什么鈴聲,以及如何振動宣赔,寫法如下:

notification.defaults = Notification.DEFAULT_ALL;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预麸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儒将,更是在濱河造成了極大的恐慌吏祸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩蚊,死亡現(xiàn)場離奇詭異贡翘,居然都是意外死亡,警方通過查閱死者的電腦和手機砰逻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門鸣驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝠咆,你說我怎么就攤上這事丐巫。” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵递胧,是天一觀的道長。 經(jīng)常有香客問我赡茸,道長缎脾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任占卧,我火速辦了婚禮遗菠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘华蜒。我一直安慰自己辙纬,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布叭喜。 她就那樣靜靜地躺著贺拣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捂蕴。 梳的紋絲不亂的頭發(fā)上譬涡,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音啥辨,去河邊找鬼涡匀。 笑死,一個胖子當著我的面吹牛溉知,可吹牛的內(nèi)容都是我干的陨瘩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼级乍,長吁一口氣:“原來是場噩夢啊……” “哼舌劳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卡者,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蒿囤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崇决,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體材诽,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年恒傻,在試婚紗的時候發(fā)現(xiàn)自己被綠了脸侥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡盈厘,死狀恐怖睁枕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤外遇,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布注簿,位于F島的核電站,受9級特大地震影響跳仿,放射性物質(zhì)發(fā)生泄漏诡渴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一菲语、第九天 我趴在偏房一處隱蔽的房頂上張望妄辩。 院中可真熱鬧,春花似錦山上、人聲如沸眼耀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮伟。三九已至,卻和暖如春鸯屿,著一層夾襖步出監(jiān)牢的瞬間澈吨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工寄摆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谅辣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓婶恼,卻偏偏與公主長得像桑阶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勾邦,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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