Notification Note from google codelab
Note from google codelab:
Advanced Android in Kotlin 01.1: Using Android Notifications
TL;DR
- 最基本文字類型通知包含 – 標題、內文、圖示
- 每個通知都有自己的 id
- 發相同 id 的通知就是更新那個通知
- 可收回那個通知
- Channel
- 一定要設定channel,可以分多個不同channel,使用者可在手機本身”設定”裡面,分別開關
- “設定”裡面出現的 channel 名字為程式裡面自訂
- 可分成最新回文、回文通知兩個 channel
- 每個 channel 都可以有各自的channel樣式、行為、是否顯示badge…
最基本的通知
最基本的通知只須設定這三個東西
- title
- content
- icon
基本文字類型通知版面介紹
建立並送出通知
- NotificationCompact.builder() 建立 builder
val builder = NotificationCompact.Builder(context, channel_id)
- builder 設定 icon, title, content
- setSmaillIcon()
- setContentTitle()
- setContentText()
- 取得 NotificationManager
val notificationManager = ContextCompact.getSystemService(applicationContext, NotificationManager::class.java) as NotificationManager
- 每個通知都會有個 id 代表他自己,之後可以用來更新或取消, notificaiton_id
- 如果你的通知只想保留為一個通知而已,就將所有通知都訂為同一個 id 就可以了
- 透過 NotificationManager 送出通知
notificationManager.notify(notificaiton_id, builder.build())
通知如果沒有設定 channel
- API level 26 (Android 8) 以上的通知就不會顯示,因為26以上規定要設定 channel
- 26以下的仍可以顯示
可以替通知設定 channel
channel 就像替通知分種類
長壓 app 的 icon 可以看到跳出來的選單,有的 app 有替通知分類
egg timer 的 code lab 中舉例
- 設定一個channel,當蛋煮熟了通知你 Egg
- 設定另一個channel,每天提醒你早餐煮一顆蛋 Egg_2
- 使用者可以分別設定每個 channel 的通知,例如使用者可以停用每天早餐煮蛋的通知,但是繼續接收蛋煮熟的通知
- 各channel的設定,使用者可以再自行於設定裡面設定
圖1~圖4
- 圖1 : Egg Timer 自訂兩個 Channel ,Egg 及 Egg_2,Egg 及 Egg_2 的名字為程式中自訂
- 圖2、圖3 : 使用者可再自訂各 channel 的設定,圖中為 Egg channel 的設定畫面
- 圖4: Channel 的描述,可以在程式中自訂
Channel 的建立
- app 內替 channel 做些預設的設定,使用者之後可以在手機的”設定”裡面自行修改設定
- 記住要SDK版號大於android 8的才能建立 channel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //建立channel }
- 用 NotificationChannel 建立一個 channel
val notificaitonChannel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW)
- channelId – 每個 channel 都要有一個獨立的 id
- channelName – channel 的名字,這個名字也會出現在使用者手機的”設定”頁面
- 最後一個參數,通知的優先等級
- channel 可以做以下設定
// 通知是否亮燈 notificationChannel.enableLights(true) // 燈的顏色 notificationChannel.lightColor = Color.RED // 是否震動 notificationChannel.enableVibration(true) // channel 的描述 notificationChannel.description = "通知的描述"
- 透過 NotificationManager 建立 channel
val notificationManager = requireActivity().getSystemService(NotificationManager::class.java)) notificationManager.createNotificationChannel(notificationChannel)
點了通知後能進入 app 的 MainActivity
- 要建立 PendingIntent
- PendingIntent 可以讓其他 app 或是系統來跟我們的 app 互動
// 如果是討論區 app 的訊息頁,就是到 NotificationActivity::class.java val contentIntent = Intent(applicationContext, MainActivity::class.java) val contentPendingIntent = PendingIntent.getActivity( applicationContext, NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT )
- 送通知時,在通知的 builder 設定 intent 為這個 PendingIntent
- builder.setContentIntent(contentPendingIntent)
- builder 設定點了通知以後,通知自動消除
- builder.setAutoCancel(true)
程式清除所有通知
使用 NotificationManager 的 cancelAll() 來移除所有通知
NotificationManager.cancelAll()
可以使用的各種通知的 style 、型式、版型
reference : https://developer.android.com/training/notify-user/expanded?authuser=2
- BigTextStyle
- BigPictureStyle
- InboxStyle
- MediaStyle
- MessagingStyle
builder 使用 setStyle() 來設定版型
在通知上指定按鈕執行動作
在builder 透過 setAction() 來指定按鈕要執行的動作
- 建立 PendingIntent
val snoozeIntent = Intent(applicationContext, SnoozeReceiver::class.java) val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast( applicationContext, REQUEST_CODE, snoozeIntent, FLAGS )
- setAction() 指定按鈕顯示的名字,跟執行哪個 PendingIntent
builder.addAction( R.drawable.egg_icon, applicationContext.getString(R.string.snooze), snoozePendingIntent )
通知的重要性(提醒程度)
- channel 設定 importance ,可以決定通知出現時是否有聲音、或是從上面跳出 pop up 通知
- 每個 channel 都要定義
- 優先層級訂定指南可以參考 Notifications design guide 中的 “Priority levels”
- channel importance 一旦訂立,就無法再更改,但是使用者卻能在設定中完整控制通知是否出現
- 程式如果重新設定 importance 的值,使用者須移除 app 再重新安裝,才能真正變更
- android 8 以下因為沒有 channel,所以是每個通知透過 setPriority() 個別設定
- 各 importance 層級對使用者的影響程度
Badge
- 有通知時,預設 app icon 上會有小圓點,長按以後可看到通知的訊息
- 每個 channel 都可個別設定是否要顯示 badge
- 透過 channel.setShowBadge(false)