猛禽洛的程式筆記庫

[Android] 通知推播 Notification 使用方式

Notification 是一項很常在程式中使用的功能,可以用來通知使用者一些訊息。

如以下官方圖:

以下為程式碼部分:

//取得通知服務
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//設定通知點擊啟動模式
Intent intent = new Intent(this, MyActivity.class);//點擊通知後,要開啟的畫面
intent.putExtra("from","FCM");//可以帶一些參數,方便辨識此通知的用途
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//在程式中時,關閉其他的畫面,導至指定畫面
//產生PendingIntent
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1 /* Request code */, intent,
    PendingIntent.FLAG_UPDATE_CURRENT);

String channelId = "02";//自訂一個頻道ID
//這邊為自訂鈴聲
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
//開始產生一筆通知
Notification newMessageNotification = new NotificationCompat.Builder(this, channelId)
    .setSmallIcon(R.mipmap.icon_bell)//設定通知圖示(好像必填)
    .setContentTitle(messageTitle)//通知標題(必填)
    .setContentText(messageBody)//通知內文(必填)
    .setAutoCancel(true)//點擊此通知時,是否自動清除此筆通知
    .setWhen(time)//設定顯示時間
    .setSound(defaultSoundUri)//聲音
    .setContentIntent(pendingIntent)//開啟畫面
    .setDefaults(Notification.DEFAULT_ALL)//設定預設的震動響鈴模式
    .setPriority(Notification.PRIORITY_DEFAULT)//設定重要度
    .build();
//Android 8.0後通知作法會不太一樣,所以要做相容:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  String channelName = "推播通知";//在系統設定的程式設定通知中,要顯示的名稱
  NotificationChannel mChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
  mChannel.enableVibration(true);//是否開啟震動
  mChannel.enableLights(true);//是否開啟燈號閃爍
  mChannel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
      , new AudioAttributes.Builder()
      .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
      .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
      .build());//通知音效
  notificationManager.createNotificationChannel(mChannel);
}
//顯示通知(通知ID,如果一樣就會覆蓋)
notificationManager.notify(notifyID /* ID of notification */, newMessageNotification);

通知ID須注意不可重複到,可以使用random來產生

實務上每隻手機能顯示的通知數量是有限的(約50則上下,看機型),所以必須要能管理ID,將最早的通知給清除掉

下面是我自己的方法,僅共參考XD

int notifyIdIndex = 100;//推播id從100開始
int notifyMaxId = 120;//推播最大20則
//計算通知ID
if(notifyIdIndex < notifyMaxId){
  notifyIdIndex++;
}else{
  notifyIdIndex = 100;
}
notificationManager.cancel(notifyIdIndex);//先清掉此通知
//顯示通知
notificationManager.notify(notifyIdIndex /* ID of notification */, newMessageNotification);

-END-

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *