[Android] Notification之應用

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);

    }
如需使用震動或閃光功能時,需再manifests加入<uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="android.permission.FLASHLIGHT" />

使用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之設定
FLAG_UPDATE_CURRENT :開啟新的Intent時,將自動更新extra資料並取代舊有的資料。
甚麼是PendingIntent? 與Intent有甚麼分別? 有興趣的朋友可以GOOGLE大神尋找相關答案。
基本上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) //抬頭顯示
注意:如果需使用抬頭顯示時,須設定.setVibrate,不知是否是BUG的緣故,沒有設定此震動參數時,抬頭顯示無法作用

 setVisibility()為鎖屏時所要顯示的信息量,

.setVisibility(Notification.VISIBILITY_PRIVATE)
VISIBILITY_PUBLIC:鎖屏上顯示完整訊息
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);