《Android》『NotificationManager』- 顯示通知訊息(Notifications)的基本用法
《Android Developers 參考文獻》
《繼承架構》
extends Object
java.lang.Object
↳ android.app.NotificationManager
《簡單介紹》
有時候當我們在使用手機時,常常在上面的狀態列中,突然跳出一個通知,讓使用者可以將狀態列拉出來點選,這樣的功能即稱作通知訊息(Notifications),它允許在使用不同的 APP 時觸發,也就是說,就算發出該通知的 APP 目前並不是正在使用,使用者還是可以透過通知訊息,取得該 APP 想要告知我的資訊,再進一步透過點選該通知,執行該 APP 希望我們做的動作。
《NotificationManager、Notification 與 Notification.Builder》
在探討如何使用顯示通知訊息功能前,我們必須先搞清楚所會用到的一些元件,分別是負責整個系統通知控管機制的 NotificationManager;用來儲存相關設定屬性、當作真正通知訊息主體的 Notification;以及在 Android 6.0 以後,被指定用來建構 Notification 的 Notification.Builder。
條列整理如下 –
NotificationManager :
負責整個 Android 系統的通知控管機制。
Notification :
用來儲存相關設定屬性(如是否閃燈、震動…),當作真正通知訊息主體之類別。
Notification.Builder :
在 API level 11 以後,Notification.Builder 被指定用來建構 Notification,捨棄了直接宣告 notification 再透過 setLatestEventInfo 方法的方式。
《基本用法》
以前在實作顯示通知訊息這個功能的時候,通常的作法是先初始化 NotificationManager 並取得 Notification 服務後,用 Notification notification = new Notification(); 的方式,宣告一個 notification 物件,再直接透過此物件設定 notification 的各個屬性,但在 API level 11 之後,notification.setLatestEventInfo() 這個方法已經不被維護(已於 Android 6.0 中移除),我們已無法直接透過 notification 設定我們要的通知訊息標題、內容以及所設定的 contentIntent,在 Android 6.0 中,Google 建議我們透過 Notification.Builder 來建構 notification。
因此,步驟會改為 –
Step1. 初始化 NotificationManager,取得 Notification 服務。
1 2 |
NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); |
Step2. 設定當執行這個通知之後,所要執行的 activity。
1 2 3 4 |
Intent notifyIntent = new Intent(MainActivity.this, MainActivity.class); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent appIntent = PendingIntent.getActivity(MainActivity.this, 0, notifyIntent, 0); |
Step3. 透過 Notification.Builder 來建構 notification (設定相關屬性)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Notification.Builder builder = new Notification.Builder(MainActivity.this); builder.setContentIntent(appIntent) // 傳入 Step2 所設定的 PendingIntent .setSmallIcon(R.drawable.ic_launcher) // 設置狀態列裡面的圖示(小圖示) .setLargeIcon(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.ic_launcher)) // 下拉下拉清單裡面的圖示(大圖示) .setTicker("notification on status bar.") // 設置狀態列的顯示的資訊 .setWhen(System.currentTimeMillis())// 設置時間發生時間 .setAutoCancel(false) // 設置通知被使用者點擊後是否清除 //notification.flags = Notification.FLAG_AUTO_CANCEL; .setContentTitle("Notification Title") // 設置下拉清單裡的標題 .setContentText("Notification Content")// 設置上下文內容 .setOngoing(true) //true使notification变为ongoing,用户不能手动清除 // notification.flags = Notification.FLAG_ONGOING_EVENT; notification.flags = Notification.FLAG_NO_CLEAR; .setDefaults(Notification.DEFAULT_ALL) //使用所有默認值,比如聲音,震動,閃屏等等 // .setDefaults(Notification.DEFAULT_VIBRATE) //使用默認手機震動提示 // .setDefaults(Notification.DEFAULT_SOUND) //使用默認聲音提示 // .setDefaults(Notification.DEFAULT_LIGHTS) //使用默認閃光提示 // .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND) //使用默認閃光提示 與 默認聲音提示 // .setVibrate(vibrate) //自訂震動長度 // .setSound(uri) //自訂鈴聲 // .setLights(0xff00ff00, 300, 1000); //自訂燈光閃爍 (ledARGB, ledOnMS, ledOffMS) |
Step4. 將透過 Notification.Builder 設定好的屬性塞回 notification,並開始將顯示通知訊息發送至狀態列上。
1 2 3 4 |
//將透過 Notification.Builder 設定好的屬性塞回宣告的 notification Notification notification = builder.getNotification(); //把指定ID(常數0)的通知持久的發送到狀態條上. mNotificationManager.notify(0, notification); |
在這個步驟要注意的是,builder.getNotification()這個方法在 API level 16 以後,亦不再被維護,Google 建議在透過 Notification.Builder 建構 notification 後,直接使用其 .build() 的方法,省去了建構完畢以後還要再整定的步驟,也就是說,在新的寫法裡,我們會將 Step3 與 Step4 直接合併改為下列寫法 –
Step3 + Step4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Notification notification = new Notification.Builder(MainActivity.this) .setContentIntent(appIntent) .setSmallIcon(R.drawable.ic_launcher) // 設置狀態列裡面的圖示(小圖示) .setLargeIcon(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.ic_launcher)) // 下拉下拉清單裡面的圖示(大圖示) .setTicker("notification on status bar.") // 設置狀態列的顯示的資訊 .setWhen(System.currentTimeMillis())// 設置時間發生時間 .setAutoCancel(false) // 設置通知被使用者點擊後是否清除 //notification.flags = Notification.FLAG_AUTO_CANCEL; .setContentTitle("Notification Title") // 設置下拉清單裡的標題 .setContentText("Notification Content")// 設置上下文內容 .setOngoing(true) //true使notification变为ongoing,用户不能手动清除 // notification.flags = Notification.FLAG_ONGOING_EVENT; notification.flags = Notification.FLAG_NO_CLEAR; .setDefaults(Notification.DEFAULT_ALL) //使用所有默認值,比如聲音,震動,閃屏等等 // .setDefaults(Notification.DEFAULT_VIBRATE) //使用默認手機震動提示 // .setDefaults(Notification.DEFAULT_SOUND) //使用默認聲音提示 // .setDefaults(Notification.DEFAULT_LIGHTS) //使用默認閃光提示 // .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND) //使用默認閃光提示 與 默認聲音提示 // .setVibrate(vibrate) //自訂震動長度 // .setSound(uri) //自訂鈴聲 // .setLights(0xff00ff00, 300, 1000) //自訂燈光閃爍 (ledARGB, ledOnMS, ledOffMS) .build(); //把指定ID的通知持久的發送到狀態條上 mNotificationManager.notify(0, notification); |
《程式範例》
綜合以上,現在在顯示通知訊息的用法上,基本步驟應該如下 –
Step1. 初始化 NotificationManager,取得 Notification 服務。
Step2. 設定當執行這個通知之後,所要執行的 activity。
Step3. 透過 Notification.Builder 來建構 notification,並直接使用其 .build() 的方法將設定好屬性的 Builder 轉換成 notification,最後開始將顯示通知訊息發送至狀態列上。
以下透過程式碼片段的方式,說明如何顯示通知訊息 –
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:text="Notify" android:id="@+id/btn_Notify" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> </LinearLayout> |
activity_main.xml
直接宣告一個按鈕,用來測試顯示通知訊息的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
. . . public class MainActivity extends Activity { Button btn_Notify; //震動時間長度參數 long[] vibrate = {0,100,200,300}; //音樂Uri參數 Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); // uri = Uri.parse("file:///sdcard/Notifications/hangout_ringtone.m4a"); // uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.ring); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_Notify = (Button)findViewById(R.id.btn_Notify); btn_Notify.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Step1. 初始化NotificationManager,取得Notification服務 NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); //Step2. 設定當按下這個通知之後要執行的activity Intent notifyIntent = new Intent(MainActivity.this, MainActivity.class); notifyIntent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent appIntent = PendingIntent.getActivity(MainActivity.this, 0, notifyIntent, 0); //Step3. 透過 Notification.Builder 來建構 notification, //並直接使用其.build() 的方法將設定好屬性的 Builder 轉換 //成 notification,最後開始將顯示通知訊息發送至狀態列上。 Notification notification = new Notification.Builder(MainActivity.this) .setContentIntent(appIntent) .setSmallIcon(R.drawable.ic_launcher) // 設置狀態列裡面的圖示(小圖示) .setLargeIcon(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.ic_launcher)) // 下拉下拉清單裡面的圖示(大圖示) .setTicker("notification on status bar.") // 設置狀態列的顯示的資訊 .setWhen(System.currentTimeMillis())// 設置時間發生時間 .setAutoCancel(false) // 設置通知被使用者點擊後是否清除 //notification.flags = Notification.FLAG_AUTO_CANCEL; .setContentTitle("Notification Title") // 設置下拉清單裡的標題 .setContentText("Notification Content")// 設置上下文內容 .setOngoing(true) //true使notification變為ongoing,用戶不能手動清除// notification.flags = Notification.FLAG_ONGOING_EVENT; notification.flags = Notification.FLAG_NO_CLEAR; .setDefaults(Notification.DEFAULT_ALL) //使用所有默認值,比如聲音,震動,閃屏等等 // .setDefaults(Notification.DEFAULT_VIBRATE) //使用默認手機震動提示 // .setDefaults(Notification.DEFAULT_SOUND) //使用默認聲音提示 // .setDefaults(Notification.DEFAULT_LIGHTS) //使用默認閃光提示 // .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND) //使用默認閃光提示 與 默認聲音提示 .setVibrate(vibrate) //自訂震動長度 // .setSound(uri) //自訂鈴聲 // .setLights(0xff00ff00, 300, 1000) //自訂燈光閃爍 (ledARGB, ledOnMS, ledOffMS) .build(); // 將此通知放到通知欄的"Ongoing"即"正在運行"組中 notification.flags = Notification.FLAG_ONGOING_EVENT; // 表明在點擊了通知欄中的"清除通知"後,此通知不清除, // 經常與FLAG_ONGOING_EVENT一起使用 notification.flags = Notification.FLAG_NO_CLEAR; //閃爍燈光 notification.flags = Notification.FLAG_SHOW_LIGHTS; // 重複的聲響,直到用戶響應。 notification.flags = Notification.FLAG_INSISTENT; / // 把指定ID的通知持久的發送到狀態條上. mNotificationManager.notify(0, notification); // 取消以前顯示的一個指定ID的通知.假如是一個短暫的通知, // 試圖將之隱藏,假如是一個持久的通知,將之從狀態列中移走. // mNotificationManager.cancel(0); //取消以前顯示的所有通知. // mNotificationManager.cancelAll(); } }); } } . . . |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.xylon.notificationsample" > <uses-permission android:name="android.permission.VIBRATE" /> <application ... ... <activity android:name=".MainActivity" > ... </activity> </application> </manifest> |
AndroidManifest.xml
這個程式碼範例中,盡量列出了在 Notification.Builder 中可以設定的屬性,裡面要注意的是,若是要設定通知震動的功能,需在 Androidmanifest.xml 中新增 android.permission.VIBRATE 這個權限。
臉書留言
一般留言