Android - Notification與Notification Manager學習筆記

Android - Notification與Notification Manager學習筆記

在Android的操作環境裡面,常看到一些好用的App在收到訊息時,如果我們當前不是開著該App,

它都會幫我們顯示在狀態列中,出現如下的圖示,把通知訊息放置於此告訴我們:

image

隨著用戶點擊通知訊息內容後啟動該通知所屬的應用程式,顯示通知的內容或是接著往下用戶的任務。

這樣的操作習慣跟在iPhone上的使用比較不相似,因為iPhone收到通知的訊息,它是直接使用如下的呈現方法:

image

然而這樣的通知功能,對於手機用戶而言是蠻常使用的。因此,接下來就針對負責Android通知的重要類別加以

做學習上筆記:

 

NotificationManager

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

Notification物件用於呈現要通知的內容與支援相當豐富的通知方式,讓用戶在接收到時可以有不同的感觸,包括:通知音效、

播放音樂、震動、提示燈等等。因此,可以把它當作真正要通知的主體。那接下來直接針對常用的屬性與方式加以說明:

a. 重要方法

方法 說明
Notification(int icon, CharSequence tickerText, long when) 初始化notification物件,並指定出現於Status Bar中的icon、文字與顯示的timestamp。此處的tickerText是出現於如下圖的位置:
image
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: }

 

[範例檔案]

[補充]

PendingIntent

該類別用於描述要排定的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学习笔记

 

Dotblogs Tags: