# Notification ### 實作點擊按鈕發送Notification ### step 1 建立Notification channel * 先定義初始化function * API大於26才需要提供channel ID,所以會加入版本判斷 * 透過NotificationChannel把資訊帶入,傳入id,Name,Importance。第三個是可以定義通知的效果,其中差異可以參考原始碼的說明 * 最後透過NotificationManager創建Notification channel ```kotlin= private val CHANNEL_ID = "channelID" private val CHANNEL_NAME = "channelName" private val NOFITICATION_ID = 0 //初始化channel private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH ).apply { lightColor = Color.GREEN enableLights(true) } val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel) } } /** * A notification with no importance: does not show in the shade. */ public static final int IMPORTANCE_NONE = 0; /** * Min notification importance: only shows in the shade, below the fold. This should * not be used with {@link Service#startForeground(int, Notification) Service.startForeground} * since a foreground service is supposed to be something the user cares about so it does * not make semantic sense to mark its notification as minimum importance. If you do this * as of Android version {@link android.os.Build.VERSION_CODES#O}, the system will show * a higher-priority notification about your app running in the background. */ public static final int IMPORTANCE_MIN = 1; /** * Low notification importance: Shows in the shade, and potentially in the status bar * (see {@link #shouldHideSilentStatusBarIcons()}), but is not audibly intrusive. */ public static final int IMPORTANCE_LOW = 2; /** * Default notification importance: shows everywhere, makes noise, but does not visually * intrude. */ public static final int IMPORTANCE_DEFAULT = 3; /** * Higher notification importance: shows everywhere, makes noise and peeks. May use full screen * intents. */ public static final int IMPORTANCE_HIGH = 4; /** * Unused. */ public static final int IMPORTANCE_MAX = 5; ``` ### step 2 將要傳送的message丟進channel * 用NotificationCompat.Builder把要通知的訊息包在裡面 * 基本上設定標題、內容、圖示、優先權、點選通知後自動清除 ```kotlin= val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("this is title") .setContentText("this is content") .setSmallIcon(R.drawable.ic_baseline_airline_seat_individual_suite_24) .setPriority(NotificationCompat.PRIORITY_HIGH) .build() ``` ### step 3 發送通知 ```kotlin= val notificationManager = NotificationManagerCompat.from(this) findViewById<Button>(R.id.btn_send).setOnClickListener { notificationManager.notify(NOFITICATION_ID,notification) } ``` ### 使用者點選通知時的事件 * 宣告PendingIntent ```kotlin= //intent要執行的class val intent = Intent(this, MainActivity::class.java) //宣告一個PendingIntent,它要執行的內容為上述的Intent val pendingIntent = TaskStackBuilder.create(this).run { addNextIntentWithParentStack(intent) //當要執行的Intent已經存在,則會覆蓋掉使用最新的狀態.. getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT) } ``` * 加入到NotificationCompat Builder中 ```kotlin= val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("this is title") .setContentText("this is content") .setSmallIcon(R.drawable.ic_baseline_airline_seat_individual_suite_24) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) .setContentIntent(pendingIntent) .build() ``` ### 完整code ```kotlin= class MainActivity : AppCompatActivity() { private val CHANNEL_ID = "channelID" private val CHANNEL_NAME = "channelName" private val NOFITICATION_ID = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) createNotificationChannel() val intent = Intent(this, MainActivity::class.java) val pendingIntent = TaskStackBuilder.create(this).run { addNextIntentWithParentStack(intent) getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT) } val notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("this is title") .setContentText("this is content") .setSmallIcon(R.drawable.ic_baseline_airline_seat_individual_suite_24) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) .setContentIntent(pendingIntent) .build() val notificationManager = NotificationManagerCompat.from(this) findViewById<Button>(R.id.btn_send).setOnClickListener { notificationManager.notify(NOFITICATION_ID,notification) } } //初始化channel private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH ).apply { lightColor = Color.GREEN enableLights(true) } val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel) } } } ``` 參考資料 [Philipp Lackner's channel](https://www.youtube.com/watch?v=urn355_ymNA) ###### tags: `Notification` `kotlin` `Android`