在 Android 3.0 之前,通知是使用 Notification() 來達成
val notification = Notification(icon, tickerText, when)
在 Android 3.0 以後,使用 Notification.Builder 執行通知
val notification = Notification.Builder(context)
所以後來為了兼容之前的版本,新增了 NotificationCompat.Builder 來執行通知
val notification = NotificationCompat.Builder(context)
另外,在 Android API level 26.1.0 只傳入 context 的建構子已被棄用,新的建構子還需多傳入 channel Id
val notification = NotificationCompat.Builder(context, channelId)
Android 8.0 前使用方式
要成功顯示出通知
首先需要建立一 NotificationManager 物件
建立一 Builder ,並將細節的屬性設置添加給上去
呼叫 Builder.build() 得到 Notification 物件
NotificationManager 執行 notify 方法執行通知
如果在 Android 4.4 版本以上設定 setLargeIcon 時使用 BitmapFactory.decode 來提供 Bitmap 的話
傳入的資源檔如果是 vector ,則 bitmap 會回傳 null,造成圖案無法顯示;建議直接使用 jpeg 或 png 等圖檔
val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val builder =
NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_star_black_24dp)
.setContentTitle(“My notification”)
.setContentText(“Hello World!”)
val notificationId = 1
val notification = builder.build()
notificationManager.notify(notificationId, notification)
Android 8.0 後使用方式
在 Android 8.0 後,除了原本的動作還 “必須” 建立一個 NotificationChannel 並使用 createNotificationChannel() 方法指定給 NotificationManager
要注意在建立 Builder 時傳入的參數 “channelId” 要與建立的 NotificationChannel 物件帶入的第一個參數一致,這樣才能對應的上
val builder =
NotificationCompat.Builder(this, “channel01”)
.setSmallIcon(R.drawable.ic_star_black_24dp)
.setContentTitle(“My notification”)
.setContentText(“Hello World”)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setVibrate(longArrayOf(300, 600, 300, 600))
.setLights(Color.GREEN, 1000, 1000)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
val channel = NotificationChannel(
“channel01”,
“MyChannel”,
NotificationManager.IMPORTANCE_HIGH
)
val notificationId = 1
val notification = builder.build()
notificationManager.createNotificationChannel(channel)
notificationManager.notify(notificationId, notification)
點擊操作
在按下通知欄的通知時,我們可能會希望可以跳轉到某一個 Activity
這時候可以使用 PendingIntent 來達成
val intent = Intent(this, MainActivity::class.java)
val pendingIntent =
PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT)
接著在 Builder 建立時呼叫 setContentIntent 方法
val builder =
NotificationCompat.Builder(this, “channel01”)
.setSmallIcon(R.drawable.ic_star_black_24dp)
.setContentTitle(“My notification”)
.setContentText(“Hello World”)
…
.setContentIntent(pendingIntent)
完整專案可以看 Github 連結
转载请注明:XAMPP中文组官网 » Day 16 Notification