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)

About: Kaito


發佈留言

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

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料