通知系統(tǒng)使用戶得知應(yīng)用中重要的事情,例如有新信息到來或者日歷事件提醒。將通知作為一個新的通道,提醒用戶重要的事情或者記錄下用戶沒有注意到的事情。
具體見中文開發(fā)者文檔
Jelly Bean 以后,8.0以前版本的通知:
- 通知可以包含操作,使用戶可以在通知抽屜中直接作出回應(yīng)。
- 通知在大小和布局方面更加靈活,可以展開以顯示更多信息。
- 新的優(yōu)先級標志讓通知可以按照重要程度排序,而不僅僅只是按照時間順序。
創(chuàng)建一個通知:
fun createNotification(view: View) {
val builder = NotificationCompat.Builder(this)
val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
//設(shè)置大圖標
builder.setLargeIcon(bitmap)
//設(shè)置小圖標
builder.setSmallIcon(R.drawable.depu)
//設(shè)置標題
builder.setContentTitle("這是標題,id=$id")
//設(shè)置正文
builder.setContentText("這是正文")
//設(shè)置摘要
builder.setSubText("這是摘要")
//顯示指定文本
builder.setContentInfo("這是info")
//設(shè)置是否點擊消息后自動clean
builder.setAutoCancel(true)
//可以設(shè)置對消息的計數(shù),位置和setContentInfo一樣,設(shè)置setContentInfo過則setNumber失效
builder.setNumber(msgNumbe)
//狀態(tài)欄顯示時的文本
builder.setTicker("在狀態(tài)欄上顯示的文本")
//設(shè)置優(yōu)先級,影響出現(xiàn)在通知欄的排序
builder.priority = NotificationCompat.PRIORITY_HIGH
//設(shè)置顯示的時間,可以自定義
builder.setWhen(System.currentTimeMillis())
//true代表正在進行的通知,此時用戶無法清除通知
builder.setOngoing(true)
//設(shè)置消息的提醒方式,震動提醒:DEFAULT_VIBRATE 聲音提醒:NotificationCompat.DEFAULT_SOUND
//三色燈提醒NotificationCompat.DEFAULT_LIGHTS 以上三種方式一起:DEFAULT_ALL
builder.setDefaults(NotificationCompat.DEFAULT_SOUND)
//設(shè)置震動方式,延遲零秒,震動一秒,延遲一秒、震動一秒
builder.setVibrate(longArrayOf(0, 1000, 1000, 1000))
val intent = Intent(this, ShowActivity::class.java)
intent.putExtra(INTENT_KEY, id)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
//設(shè)置意圖
builder.setContentIntent(pendingIntent)
val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(id, builder.build())
id++
msgNumbe++
}
如果我連續(xù)點擊5次,那么每一個通知點進去,intent傳遞過來的參數(shù)都是最后一個,這個后面再說。
注意:
notificationManager.notify(id, builder.build())
這里的id代表著通知欄的通知是不是同一個,如果id一樣,只會顯示一個通知。
創(chuàng)建一個顯示多行文本的通知:
val builder = NotificationCompat.Builder(this)
val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
//設(shè)置大圖標
builder.setLargeIcon(bitmap)
//設(shè)置小圖標
builder.setSmallIcon(R.drawable.depu)
//設(shè)置標題
builder.setContentTitle("這是標題,id=$id")
//設(shè)置正文
builder.setContentText("這是正文")
//顯示許多文本,最對12行。部分機型不支持。
val bigTextStyle = NotificationCompat.BigTextStyle()
bigTextStyle.bigText("如果已經(jīng)有正在等待處理的相同類型通知了,那么你的應(yīng)用不應(yīng)當再創(chuàng)建一條新的通知,而是將多條通知合并。合并的通知提供了總體的信息描述,并且告知用戶有多少條通知正在等待處理。")
bigTextStyle.setBigContentTitle("多文本時候的標題")
//許多文本時候的摘要
bigTextStyle.setSummaryText("這是摘要")
builder.setStyle(bigTextStyle)
大多時候的通知,需要很多條,并且點擊后獲得意圖的攜帶參數(shù)都市不一樣的。
PendingIntent的flag取值有四個:
- FLAG_ONE_SHOT:獲取的PendingIntent只能使用一次
- FLAG_NO_CREATE:利用FLAG_NO_CREAT獲取的PendingIntent,若描述的Intent不存在則返回NULL值
- FLAG_CANCEL_CURRENT:如果描述的PendingIntent已經(jīng)存在,則在產(chǎn)生新的Intent之前會先取消掉當前的
- FLAG_UPDATE_CURRENT:能夠新new一個 Intent
比如demo里的id每次都增加,但是獲取到的id顯示規(guī)則如下:
val intent = Intent(this, ShowActivity::class.java)
intent.putExtra(INTENT_KEY, id)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
點擊兩次發(fā)出2個通知,id分別是1,2:
| flag | requestCode | 結(jié)果 | 備注 |
|---|---|---|---|
| FLAG_ONE_SHOT | 不變 | 先id為1的通知獲取到1,再點擊id為2的通知,通知消失,沒有跳轉(zhuǎn)。 先id為2的通知獲取到1,再點擊id為1的通知,通知消失,沒有跳轉(zhuǎn)。 |
只能獲取最早的數(shù)據(jù) |
| FLAG_ONE_SHOT | 不同 | 先id為1的通知獲取到1,再點擊id為2的通知獲取獲取到2 先id為2的通知獲取到2,再點擊id為1的通知獲取獲取到1, |
能正確獲取數(shù)據(jù) |
| FLAG_NO_CREATE | 不變 | 先id為1的通知無反應(yīng),再點擊id為2的通知無反應(yīng) 先id為2的通知無反應(yīng),再點擊id為1的通知無反應(yīng) |
無反應(yīng) |
| FLAG_NO_CREATE | 不同 | 先id為1的通知無反應(yīng),再點擊id為2的通知無反應(yīng) 先id為2的通知無反應(yīng),再點擊id為1的通知無反應(yīng) |
無反應(yīng) |
| FLAG_CANCEL_CURRENT | 不變 | 先id為1的通知,通知消失,不跳轉(zhuǎn),再點擊id為2的通知獲取獲取到2 先id為2的通知獲取到2,再點擊id為1的通知,通知消失,不跳轉(zhuǎn) |
最新的通知能正確獲取數(shù)據(jù) |
| FLAG_CANCEL_CURRENT | 不同 | 先id為1的通知獲取到1,再點擊id為2的通知獲取獲取到2 先id為2的通知獲取到2,再點擊id為1的通知獲取獲取到1, |
能正確獲取數(shù)據(jù) |
| FLAG_UPDATE_CURRENT | 不變 | 先id為1的通知獲取到2,再點擊id為2的通知獲取獲取到2 先id為2的通知獲取到2,再點擊id為1的通知獲取獲取到2, |
只能獲取到最新的數(shù)據(jù) |
| FLAG_UPDATE_CURRENT | 不同 | 先id為1的通知獲取到1,再點擊id為2的通知獲取獲取到2 先id為2的通知獲取到2,再點擊id為1的通知獲取獲取到1, |
能正確獲取數(shù)據(jù) |