均屬于筆記,僅供個人參考糕篇,有問題歡迎指正啄育,整理模式
一,通知的基本應用
通知的用法還是比較靈活的拌消,既可以在活動里創(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;