Notification,中譯為"通知",當一個正在動作的Activity或Service在背景執行時或者BroadcastReceiver,可利用Notifycation顯示於頂部的通知欄,告知某些訊息,例如常使用的Line、Mail、FB、Skype都可看見Notification的應用,當有聯絡人在Line密您時,或FB有新狀態時都會顯示於手機頂部,此篇文章將介紹Notification之簡單應用。
本篇將示範當點擊Notification Button時,將跳出通知訊息,如下圖紅框處所示,為一個SmallIcon與Ticker(訊息文字),但由於不知是否BUG的緣故,Ticker並沒有顯示出來,之後可能要再研究。
如果將手機TOP的選單下拉,可看到訊息嵌板,信息嵌板包括了Title、內容Text、信息info、與左邊的LargeIcon,而時間的部分並不需設定系統會自己顯示。
點擊訊息嵌板時,將可跳到另一個Activity頁面如下圖。
在Notification的應用中,會使用到 NotificationManager()與Notification(),其中NotificationManager是屬於系統層級的背景服務,因此需使用getSystemService取得實例。以下將進行程式碼的示範與講解。
建立另一個Activity,以供範例使用,將Layout中的Button及版面配置好後,接著進行java的撰寫。
將所需的Button與NotificationManager定義,
private Button notifibtn,cancelbtn;
NotificationManager notificationManager;
接著將各Button綁定ID與監聽器,其中NotificationManager為Service層級,需使用getSystemService取得實例
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
notificationManager=(NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);//NotificationManager需使用getSystemService取得實例
notifibtn=(Button)findViewById(R.id.notifibtnID);
cancelbtn=(Button)findViewById(R.id.cancelbtnID);
cancelbtn.setOnClickListener(new btnclicklistener());
notifibtn.setOnClickListener(new btnclicklistener());
}
下面onClicke內,點擊Notification Button時,執行addNotification(),其中兩個輸入參數為Context context與Int nid,點擊Cancel Button時取消Notification。
class btnclicklistener implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.notifibtnID:
addNotification(getBaseContext(),1); //調用addNotification()Method,兩個輸入參數分別為context與Notification ID
break;
case R.id.cancelbtnID:
notificationManager.cancelAll(); //NotificationManager的cancelALL()將會取消所有的Notification,或者也可使用cancel(int id)指定特定ID的notification取消。
break;
}
}
}
以下是addNotification() Method的撰寫, 將挑幾個重點來講解:
private void addNotification(Context context,int nid){
Notification.Builder samBuilder=new Notification.Builder(context); //Notification建構器
Intent notifyIntent=new Intent(context,testActivity.class); //Intent所需切換的Activity
//Intent旗標參數:
// Intent.FLAG_ACTIVITY_NEW_TASK:在堆疊中開啟一個新的任務
// Intent.FLAG_ACTIVITY_SINGLE_TOP:將Activity顯示在最上層
// Intent.FLAG_ACTIVITY_CLEAR_TOP:當前Activity會被新的Intent覆蓋
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent= PendingIntent.getActivity(context,1,notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT); //PendingIntent之設定
Bitmap bmp= BitmapFactory.decodeResource(getResources(),R.mipmap.hl); //setLargeIcon時使用
long[] vibratepattern={400,500};//setVibrate時使用
samBuilder.setContentInfo("info")
.setContentText("Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(Notification.PRIORITY_HIGH)//可將訊息嵌板直接顯示在TOP,而不需下拉選單
.setTicker("Ticker")
.setVibrate(vibratepattern)//振動頻率
.setAutoCancel(true)//點擊訊息嵌板時,是否自動取消訊息嵌板?
.setContentTitle("Title NID"+nid)
.setLargeIcon(bmp)
.setVisibility(Notification.VISIBILITY_PRIVATE)
.setOnlyAlertOnce(true)
.setContentIntent(pendingIntent);
Notification samNotify=samBuilder.build();
notificationManager.notify(1,samNotify);
}
使用Notification之前,需使用Builder()建構器,來對Notification進行一些相關的參數設定,如需顯示的Title、info、Icon、等等...Builder()輸入參數為一個context
Notification.Builder samBuilder=new Notification.Builder(context); //Notification建構器
接著建立當點擊Notification訊息嵌板時,切換Activity的Intent
Intent notifyIntent=new Intent(context,testActivity.class); //Intent所需切換的Activity
對Intent設定Flags,使用OR連續填入分別為CLEAR_TOP、SINGLE_TOP、NEW_TASK, 使當點擊訊息嵌板後的Activity確保顯示在最上層。PS:SINGLE_TOP與CLEAR_TOP不能同時使用,這邊使用的是OR。
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
Intent.FLAG_ACTIVITY_NEW_TASK:在堆疊中開啟一個新的任務 Intent.FLAG_ACTIVITY_SINGLE_TOP:將Activity顯示在最上層 Intent.FLAG_ACTIVITY_CLEAR_TOP:當前Activity會被新的Intent覆蓋
建立一個PendingIntent,其使用的Method為PendingIntent.getActivity(),如果所需切換的Intent是Service則使用getService(),以下可以看到其五個輸入參數,比較需要注意的部分為requestCode與 flags的部分,當想要顯示多個不同的訊息嵌板時,建議每個requestCode都要設為不一樣
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, @Flags int flags)
PendingIntent pendingIntent= PendingIntent.getActivity(context,1,notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT); //PendingIntent之設定
基本上Intent是一個直接行為,當指定好Intent的工作後,便可直接執行了,如startActivity(),而PendingIntent則是先將一個預設的Intent先包好,可以丟給其他APK去使用。
使用serPriority可使訊息嵌板直接顯示於手機TOP,不須再下拉選單,其權重可使用以下
public static final int PRIORITY_DEFAULT = 0; public static final int PRIORITY_LOW = -1; public static final int PRIORITY_MIN = -2; public static final int PRIORITY_HIGH = 1; public static final int PRIORITY_MAX = 2;
samBuilder.setPriority(Notification.PRIORITY_HIGH) //抬頭顯示
setVisibility()為鎖屏時所要顯示的信息量,
.setVisibility(Notification.VISIBILITY_PRIVATE)
VISIBILITY_PRIVATE:基本訊息
VISIBILITY_SECRET:顯示少量信息
將所設定的pendingIntent填入setContentIntent()
.setContentIntent(pendingIntent);
最後建立一個Notification物件,並將所Build的參數設在notification上,最後在使用NotificationManager.notify(int ID,Notification notification)將所設定好的Notification廣播出去,不同的ID將額外產生一個Notification。
Notification samNotify=samBuilder.build();
notificationManager.notify(1,samNotify);