iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0
Software Development

英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康系列 第 23

Android Koltin 實作 Day 15:Notification(Notification)

使用語言

  • Kotlin

使用元件

  • Button

Method:


這次實作主要為使用 Notification

由系統發出通知,向使用者顯示通知訊息。

NotificationChannel

從 API 26 開始,Android 多了通知頻道(Notification channels)的功能,並且一定要實作通知頻道,
而 API 26 以前的版本將會顯示舊的通知效果,不會有通知頻道的效果。

左圖為應用程式通知的設定,可看到多個頻道,右圖為單一頻道點選進去後可為該頻道做的設定。

建立一個 NotificationChannel

NotificationChannel (id: String, name: CharSequence, importance: Int)

val channel = NotificationChannel("Day15", "Day15", NotificationManager.IMPORTANCE_HIGH)
  • id:建立的頻道的識別 id,一個 package 裡面不能有多個頻道擁有相同 id,id 若設置太長可能會被截斷。

  • name:使用者會看到的頻道名稱,建議名稱的最大長度為 40 個字符,若太常可能會被截斷。

  • importance:設置 APP 安裝時預設的此頻道通知重要性,使用者安裝後可在設定中作變更,會影響通知的表現方式,可為下列其中一種:

    • IMPORTANCE_UNSPECIFIED:無特定設定重要性,保留偏好設定,不應與實際通知相關聯。

      上面敘述為照官方文件翻譯,但其實看不太懂是什麼意思QQ

    • IMPORTANCE_NONE:不重要,沒有任何提醒效果(彈出提醒、音效及震動),也不會在任何地方顯示通知。

    • IMPORTANCE_MIN:重要性為最低,沒有任何提醒效果(彈出提醒、音效及震動),不顯示在狀態欄,僅顯示在展開的通知欄中。

    • IMPORTANCE_LOW:重要性低,沒有任何提醒效果(彈出提醒、音效及震動),顯示在狀態欄及展開的通知欄中。

    • IMPORTANCE_DEFAULT:預設的重要性,不會彈出提醒,可以發出音效及震動,顯示在狀態欄及展開的通知欄中。

    • IMPORTANCE_HIGH:重要性高,會彈出提醒,可以發出音效及震動,顯示在狀態欄及展開的通知欄中,可以使用全螢幕的 intent(例如手機來電時布滿螢幕的來電顯示及可選擇是否接聽的畫面)。

這裡建立好的 NotificationChannel 要被提交註冊至 NotificationManager 才能被使用。


Notification

通知的類別,可以設置通知顯示的樣貌

透過 Notification.Builder 建立 Notification

  • 建立 Notification.Builder

  • 用 Notification.Builder 中的方法設置 Notification 的樣式

    • setSmallIcon

      設置通知的小圖示,為一定要設置的項目。

      setSmallIcon (icon: Int)

    • setLargeIcon

      設置通知的大圖示。

      setLargeIcon (b: Bitmap)

    • setContentTitle

      設置通知的標題。

      setContentTitle (title: CharSequence)

    • setContentText

      設置通知的內容文字

      setContentText (text: CharSequence)

    • setContentIntent

      設置使用者點擊通知時要觸發的 intent 行為

      setContentIntent(intent: PendingIntent)

    • setAutoCancel

      讓通知在使用者點擊通知時自動移除

      setAutoCancel (autoCancel: Boolean)

    builder.setSmallIcon(R.drawable.ic_directions_walk_black_24dp)
             .setContentTitle("Day15")
             .setContentText("Day15 Challenge")
             .setLargeIcon(BitmapFactory.decodeResource(resources,R.mipmap.ic_launcher_test))
             .setAutoCancel(true)
    
  • 用 Notification.Builder 中的方法建立 Notification

    build () : Notification

    val notification : Notification = builder.build()
    
    • 回傳為 Notification 實例

NotificationManager

負責管理及發送通知的類別。

  • 取得 NotificationManager

    透過 Context 的 getSystemService 方法取得 NotificationManager 類別的實例

    getSystemService (name: String)

    val manager = getSystemServiceNOTIFICATION_SERVICE) as NotificationManager
    
    • name:想要取得的服務,帶入 NOTIFICATION_SERVICE 即可取得 NotificationManager 類別的實例
  • createNotificationChannel 方法

    在 NotificationManager 中提交註冊前面建立好的通知頻道

    createNotificationChannel (channel: NotificationChannel)

    manager.createNotificationChannel(channel)
    
    • channel:要被提交註冊至 NotificationManager 中的通知頻道
  • notify 方法

    發出通知

    • notify (id: Int, notification: Notification)

       manager.notify(0, notification)
      
      • id:發送的通知的識別 id,在同一個 App 中每個通知的 id 都應該要是唯一的。

        若新通知與舊通知的 id 一樣,則新通知會覆蓋掉舊通知。

      • notification:前面建好的要發送給使用者的通知。

    • notify (tag: String, id: Int, notification: Notification)

      • tag:發送的通知的識別字串,可以為 null(等同於上一個方法)。

      • id:發送的通知的識別 id,在同一個 App 中每個通知的 id 都應該要是唯一的。

      • notification:前面建好的要發送給使用者的通知。

實作成果

查看詳細 Code > GitHub

tags: Android Kotlin Notification

上一篇
Android Kotlin 實作 Day 14:Ball(Property Animation+Interpolator)
下一篇
Android Kotlin 實作 Day 16:PushMessaging(上)(FCM+FirebaseMessagingService)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30

尚未有邦友留言

立即登入留言