Android - Notification與Notification Manager學習筆記
在Android的操作環境裡面,常看到一些好用的App在收到訊息時,如果我們當前不是開著該App,
它都會幫我們顯示在狀態列中,出現如下的圖示,把通知訊息放置於此告訴我們:
隨著用戶點擊通知訊息內容後啟動該通知所屬的應用程式,顯示通知的內容或是接著往下用戶的任務。
這樣的操作習慣跟在iPhone上的使用比較不相似,因為iPhone收到通知的訊息,它是直接使用如下的呈現方法:
然而這樣的通知功能,對於手機用戶而言是蠻常使用的。因此,接下來就針對負責Android通知的重要類別加以
做學習上筆記:
Android整個系統架構裡Notification Manager代表負責整個系統的通知控制,通知訊息包括:電池不足、連線、開啟GPS、
狀態列的通知等。由於它屬性接近背景運作的功能,因此,當有App需要發出通知時,將統一透過NotificationManager此類
別交由系統顯示通知訊息於Android的Status Bar裡,並且夾帶著icon、message與震動、播放聲音或顯示提示燈號,用於提示用戶。
因此,該類別屬於系統管理的服務,在使用時需透過「getSystemService(NOTIFICATION_SERVICE)
」來取得服務。
該類別提供主要幾個方法讓開發者把要通知的內容與識別號設定後,系統會幫我們產生對應的顯示與呈現方式放置Status Bar中。
方法 | 說明 |
cancel(int id) | 指定要取消先前notification的識別id。如果該notification是短暫的通知,它將會被隱藏;是長期的通知將會被移除。 |
cancel(String tag, int id) | 指定要取消先前notification的tag name與識別id。如果該notification是短暫的通知,它將會被隱藏;是長期的通知將會被移除。 |
cancelAll() | 取消所有先前的notification。 |
notify(int id, Notification notification) | 指定要顯示的notification物件與識別id。 |
notify(String tag, int id, Notification notification) | 指定要顯示的notification物件與tag name、識別id。 |
[注意]
識別id與tag name是用於告訴Android系統此notification物件是由你的App所發出,因此,可想而知,App接下來如果需要重覆發送
notification物件仍會需要使用對應的id與tag name,那麼如果我id已經被用了,接下來又發了一個相同id的notification呢?那舊的
notification內容會被換成新的。然而,tag name是一個選擇性的使用參數,但如果你的notification過程中有使用到tag name,接下來
的操作就需要配合你指定的tag name來控制notification物件。
了解了NotificationManager的概念與使用方式之後,接下來介紹如何設定一個要通知的內容與要配合的聲光效果:
Notification物件用於呈現要通知的內容與支援相當豐富的通知方式,讓用戶在接收到時可以有不同的感觸,包括:通知音效、
播放音樂、震動、提示燈等等。因此,可以把它當作真正要通知的主體。那接下來直接針對常用的屬性與方式加以說明:
a. 重要方法:
方法 | 說明 |
Notification(int icon, CharSequence tickerText, long when) | 初始化notification物件,並指定出現於Status Bar中的icon、文字與顯示的timestamp。此處的tickerText是出現於如下圖的位置: |
setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) | 設定notification物件的內容,包括: context:要求發出通知的application/activity; contentTitle:設定通知的標題; contentText:設定通知的內文; contentIntent:設定Intent用於當用戶點擊notificatoin物件後,啟動 Applicatoin。與Intent用法相同,由PendingIntent類別 故名思義把Intent做為暫存,等待被啟用。 |
b. 重要常數與屬性:
方法 | 說明 |
number | 此數字代表該App通知的數量。如果該App發出了二個以上的通知,那通知在status bar就會出現個2字。 |
sound | 設定通知發出時,要使用的音效檔案,格式為uri。defaults預設的功能。 |
tickerText | 設定Notification物件的文字內容,並且支援設定組合的文字與多個圖標的顯示。 |
tickerView | 通知發出時,顯示於status bar的ticker view物件。 |
vibrate | 設定通知發出時,要震動的頻率與時間。配合vibrate(long[], int)使用。defaults預設的功能。 |
when | 該Notification物件的時間戳記。 |
ledARGB | 設定發出通知時,LED需要產生的ARGB呈現結果。需配合FLAG_SHOW_LIGHTS一起使用。 |
ledOffMS | 設定LED處於關閉時要閃爍的間隔,單位:毫秒。需配合FLAG_SHOW_LIGHTS一起使用。 |
ledOnMS | 設定LED處於開啟時要閃爍的間隔,單位:毫秒。需配合FLAG_SHOW_LIGHTS一起使用。 |
flags | 設定Notification物件要配合的特定任務,包括: FLAG_AUTO_CANCEL:設定當用戶點擊該Notification物件後,要取消通知列中的物件; FLAG_FOREGROUND_SERVICE:設定代表該通知為目前前景運行的服務; FLAG_SHOW_LIGHTS:設定通知發生時需要讓LED燈閃或關閉; FLAG_INSISTENT:設定通知發生時會持續播放聲音,直到用戶有回應為止; 更多請參考; |
defaults | 設定Notification物件經由Notification Manager產生時,需要系統產生那些反應。包括: DEFAULT_SOUND , DEFAULT_VIBRATE , DEFAULT_LIGHTS ,以全部反應都有的:DEFAULT_ALL。 |
icon | 設定Notification物件在Status Bar上顯示的icon,這是必要的屬性。而icon需存在drawable之中,如果設定的icon無效,該notification物件將不會顯示。 |
以上是針對幾個常用的方法、屬性與常數做個概要式的介紹與說明,其實蠻多常數的搭配可以做到
很多功能,但也要特別注意每個常數使用的特性。
〉範例說明:
此範例說明簡單介紹如何使用Notification Manager來發送Notification物件到status bar中,並且在用戶點擊TickerView之後,
自動啟動程式與清掉顯示於status bar中的內容。
a. 建立取得Notification Manager;
1: //初始化Notification Manager
2: NotificationManager gNotMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
b. 建立Notifiction物件,設定顯示的內容與要呈現的icon,並設定需要震動的功能;
b-1. 設定需要震動(Vibrate)的權限:
1: <!-- 設定使用Vibrate的權限 -->
2: <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
b-2. 產生Notification物件與設定要震動的頻率:
1: Button tBtnN2 = (Button) findViewById(R.id.btnNotification2);
2: tBtnN2.setOnClickListener(new View.OnClickListener() {
3: @Override
4: public void onClick(View v) {
5: //產生Notification物件,並設定基本屬性
6: Notification tBNot = new Notification(R.drawable.icon, "Vibrate Msg", System.currentTimeMillis());
7:
8: //設定震動的頻率
9: long[] tVibrate = {0,100,200,300};
10: tBNot.vibrate = tVibrate;
11:
12: //設定LED燈亮與暗的時間與顏色,並設定flags通知
13: tBNot.ledARGB = 0xff00ff00;
14: tBNot.ledOnMS = 300;
15: tBNot.ledOffMS = 1000;
16: tBNot.flags |= Notification.FLAG_SHOW_LIGHTS;
17:
18: Intent notificationIntent = new Intent(context, main.class);
19: PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
20: tBNot.setLatestEventInfo(context, "Vibrate Title", "Vibrate Content", contentIntent);
21: gNotMgr.notify(1, tBNot);
22: }
23: });
c. 發出通知,啟動程式,並清除status bar中的通知內容。
1: @Override
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: setContentView(R.layout.main);
5:
6: //初始化Notification Manager
7: gNotMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
8:
9: RegistControls(this);
10:
11: //清除所有的通知內容
12: gNotMgr.cancelAll();
13: }
[範例檔案]
[補充]
該類別用於描述要排定的Intent、Broadcast與Service,讓開發者設定特定的任務時讓它們啟動,所以提供三個主要的方式:
getActivity(Context, int, Intent, int)、getBroadcast(Context, int, Intent, int)以及
getService(Context, int, Intent, int)。透過定義好的Intent搭配PendingIntent的使用,可以用於指定的事件
被觸發時,請求PendingIntent回傳該App當初設定的Intent來執行。它本身像是一個參考的標誌,告知系統在何時需要
啟動被註冊的Intent。
======
學習Notification與Notification Manager是蠻重要的,因為當Android開發或學習到最後,比較容易遇到
一些需求是需要在背景做一些服務或定期通知之類的工作時,為了讓用戶得知目前的運作狀態或是遠端送
過來的資料是否被下載完成等,就需要透過這二個類別的配合,並加上我們對提示用戶的設定,讓用戶可
與App進行互動。以下也搜尋了一些我覺得寫的蠻多範例與介紹的文章。
References:
‧【Android笔记】Notification和NotificationManager的基本使用方法
‧Android基础教程之---Android状态栏提醒(Notification,NotificationManager)的使用!
‧Creating Status Bar Notifications (必讀)
‧Android學習筆記 - 通知(Notification)
‧主题:Android -- NotificationManager and Notification学习笔记