2012年12月15日 星期六

Android - Notification與Notification Manager學習筆記



   
 
在Android的操作環境裡面,常看到一些好用的App在收到訊息時,如果我們當前不是開著該App,
它都會幫我們顯示在狀態列中,出現如下的圖示,把通知訊息放置於此告訴我們:
image
隨著用戶點擊通知訊息內容後啟動該通知所屬的應用程式,顯示通知的內容或是接著往下用戶的任務。
這樣的操作習慣跟在iPhone上的使用比較不相似,因為iPhone收到通知的訊息,它是直接使用如下的呈現方法:
image
然而這樣的通知功能,對於手機用戶而言是蠻常使用的。因此,接下來就針對負責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是出現於如下圖的位置:
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_SOUNDDEFAULT_VIBRATEDEFAULT_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,讓開發者設定特定的任務時讓它們啟動,所以提供三個主要的方式:
getService(Context, int, Intent, int)。透過定義好的Intent搭配PendingIntent的使用,可以用於指定的事件
被觸發時,請求PendingIntent回傳該App當初設定的Intent來執行。它本身像是一個參考的標誌,告知系統在何時需要
啟動被註冊的Intent。

======
學習Notification與Notification Manager是蠻重要的,因為當Android開發或學習到最後,比較容易遇到
一些需求是需要在背景做一些服務或定期通知之類的工作時,為了讓用戶得知目前的運作狀態或是遠端送
過來的資料是否被下載完成等,就需要透過這二個類別的配合,並加上我們對提示用戶的設定,讓用戶可
與App進行互動。以下也搜尋了一些我覺得寫的蠻多範例與介紹的文章。

References:

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...