Notification及NotificationManager的使用詳解

通知是應用程序通知用戶的一種方式,它無須活動,由通知管理器進行統一管理。通知包含一下功能:

1.      創建新的狀態欄圖標

2.      在擴展的狀態欄窗口顯示額外的信息(可以發起一個意圖)

3.      閃爍/LED

4.      讓手機震動

5.      發出聲音(鈴聲,媒體庫歌曲)

通知管理器是用來處理通知的系統服務,使用getSystemService方法可以獲得對它的引用,如下:

 

NotificationManager notificationManager = (NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);

 

通過使用通知管理器,可以觸發新的通知,修改現有的通知或者刪除那些不再需要的通知。首先創建一個新的Notification對象並傳遞給它要在狀態欄顯示的圖標、狀態欄的點擊文本以及這個通知的時間。可以設置Notification對象的number屬性來顯示一個狀態欄圖標所表示的事件的數量。

Notification notification = new Notification(R.drawable.icon,"在EoeAndroidReceiver1中", System.currentTimeMillis());

可以通過兩張方式在擴展的狀態窗口配置通知的外觀。

1.      使用setLatestEventInfo方法更新標準的擴展的狀態通知顯示中所顯示的詳細信息。

2.      使用一個遠程視圖(Remote View)設置contentView和contentIntent,以便為擴展的狀態顯示分配一個定制的UI。

最簡單的方法是使用setLatestEventInfo方法來填充默認的狀態窗口佈局。標準的擴展的狀態窗口佈局會顯示構造函數中定義的圖標和時間,以及標題和一個詳細信息字符串。

 

notification.setLatestEventInfo(context, "在EoeAndroidReceiver1中", null,contentIntent);

 

通知常用於請求用戶的動作或註意,所以可以指定一個PendingIntent,當用戶單擊通知項的時候觸發它,在大多數情況下,該意圖應該打開應用程序,並導航到為通知提供瞭上下文的活動。

 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,new Intent(context, ActivityMain.class), 0);

notification.setLatestEventInfo(context, "在EoeAndroidReceiver1中", null,contentIntent);

notificationManager.notify(NOTIFICATION_ID, notification);

 

 

向通知添加聲音、閃燈和振動效果的最簡單、最一致的方式是使用當前的用戶默認設置,使用defaults屬性,可以組合:

Notification.DEFAULT_LIGHTS

Notification.DEFAULT_SOUND

Notification.DEFAULT_VIBRATE

 

如果想全部使用默認值,可以使用Notification.DEFAULT_ALL常量。

Notification.defaults =Notificaiton.DEFAULT_ALL;

 

通過向sound屬性分配一個位置URI,android可以將手機上的任意音頻文件作為通知進行播放。要使用自己定制的音頻,需要把它復制到設備上,或者把它包含在原始資源(raw)中。

Uri uri =RingtoneManager.getDefaultUri(RingtongManager.TYPE_NOTIFICATION);

Notification.sound=uri;

 

可以使用電話的振動功能,讓通知執行指定類型的振動。Android可以控制振動的類型,可以使用振動來傳遞信息或者吸引用戶的註意。

要設置振動類型,可以向通知的vibrate屬性分配一個longs類型的數組:構造該數組,可以使得代表振動時間的值和代表暫停時間的值交替存在。使用振動必須添加權限:

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

Long[] vibrate = newlong[]{1000,1000,1000,1000,1000};

notification.vibrate=vibrate;

 

通知還可以包含用來配置設備的LED的顏色和閃爍頻率的屬性。

每個設備在對LED的控制方面可能具有不同的限制。如果指定的顏色可用,則將使用一個與指定顏色最接近的顏色。

ledARGB屬性可以用來設置LED顏色,而ledOffMS和ledOnMS屬性則可以設置LED閃爍的頻率和模式。可以通過把ledOnMS屬性設置為1,並且把ledOffMS設置為0來打開LED,或者也可以通過把這兩個屬性都設置為0來關閉LED。

一旦配置瞭LED設置,就必須在通知的flags屬性中添加FLAG_SHOW_LIGHTS標記。

notification.ledARGB = Color.RED

notification.ledOffMS = 0;

notification.ledOnMS = 1;

notification.flags = notification.flags |Notification.FLAG_SHOW_LIGHTS;

 

通過設置通知的FLAG_INSISTENT和FLAG_ONGOING_EVENT標記,可以把它配置為持續的或者連續的。

持續的通知會一直重復音頻、振動和閃燈設置,隻到被取消為止。

 

1. NotificationManager和Notification用來設置通知。

    通知的設置等操作相對比較簡單,基本的使用方式就是用新建一個Notification對象,然後設置好通知的各項參數,然後使用系統後臺運行的NotificationManager服務將通知發出來。

基本步驟如下:

1)得到NotificationManager:

     String ns = Context.NOTIFICATION_SERVICE;

     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

 

2)創建一個新的Notification對象:

     Notification notification = new Notification();

     notification.icon = R.drawable.notification_icon;

     也可以使用稍微復雜一些的方式創建Notification:

     int icon = R.drawable.notification_icon; //通知圖標

     CharSequence tickerText = "Hello"; //狀態欄(Status Bar)顯示的通知文本提示

     long when = System.currentTimeMillis(); //通知產生的時間,會在通知信息裡顯示

     Notification notification = new Notification(icon, tickerText, when);

 

3)填充Notification的各個屬性:

     Context context = getApplicationContext();

     CharSequence contentTitle = "My notification";

     CharSequence contentText = "Hello World!";

     Intent notificationIntent = new Intent(this, MyClass.class);

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

     notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

 

Notification提供瞭豐富的手機提示方式:

a)在狀態欄(Status Bar)顯示的通知文本提示,如:

     notification.tickerText = "hello";

 

b)發出提示音,如:

     notification.defaults |= Notification.DEFAULT_SOUND;

     notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");

     notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

 

c)手機振動,如:

     notification.defaults |= Notification.DEFAULT_VIBRATE;

     long[] vibrate = {0,100,200,300};

     notification.vibrate = vibrate;

 

d)LED燈閃爍,如:

    notification.defaults |= Notification.DEFAULT_LIGHTS;

     或者可以自己的LED提醒模式:

    notification.ledARGB = 0xff00ff00;

    notification.ledOnMS = 300; //亮的時間

    notification.ledOffMS = 1000; //滅的時間

    notification.flags |= Notification.FLAG_SHOW_LIGHTS;

 

 

* 更多的特征屬性

* notification.flags |= FLAG_AUTO_CANCEL; //在通知欄上點擊此通知後自動清除此通知

* notification.flags |= FLAG_INSISTENT; //重復發出聲音,直到用戶響應此通知

* notification.flags |= FLAG_ONGOING_EVENT; //將此通知放到通知欄的"Ongoing"即"正在運行"組中

* notification.flags |= FLAG_NO_CLEAR; //表明在點擊瞭通知欄中的"清除通知"後,此通知不清除,

* //經常與FLAG_ONGOING_EVENT一起使用

* notification.number = 1; //number字段表示此通知代表的當前事件數量,它將覆蓋在狀態欄圖標的頂部

* //如果要使用此字段,必須從1開始

* notification.iconLevel = ; //

*/

//設置通知的事件消息

Context context = getApplicationContext(); //上下文

CharSequence contentTitle = "My Notification"; //通知欄標題

CharSequence contentText = "Hello World!"; //通知欄內容

Intent notificationIntent = new Intent(this,Main.class); //點擊該通知後要跳轉的Activity

PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

//把Notification傳遞給NotificationManager

mNotificationManager.notify(0,notification);

 

 

4)發送通知:

     private static final int ID_NOTIFICATION = 1;

     mNotificationManager.notify(ID_NOTIFICATION, notification);

 

2. 通知的更新

    如果需要更新一個通知,隻需要在設置好notification之後,再調用setLatestEventInfo,然後重新發送一次通知即可。

 

3. 自定義通知視圖

    這部分可以參考官方文檔,講的很詳細瞭。

    AndroidSDK: docs/guide/topics/ui/notifiers/notifications.html

You May Also Like