1、定义变量,并生成数据
package com.example.mynotification
import android.app.NotificationManager
import androidx.core.app.NotificationCompat
object InboxStyleMockData {
const val mContentTitle = "5 new emails"
const val mContentText = "from Jane, Jay, Alex +2 more"
const val mNumberOfNewEmails = 5
const val mPriority = NotificationCompat.PRIORITY_DEFAULT
const val mBigContentTitle = "5 new emails from Jane, Jay, Alex +2"
const val mSummaryText = "New emails"
fun mIndividualEmailSummary() : ArrayList{
val list = ArrayList()
list.add("Jane Faab - Launch Party is here ...")
list.add("Jay Walker - There's a turtle on the server!")
list.add("Alex Chang - Check this out ...")
list.add("Jane Johns- Check in code?")
list.add("John Smith - Movies later ...")
return list
}
fun mParticipants() : ArrayList{
val list = ArrayList()
list.add("Jane Fabb")
list.add("Jay Walker")
list.add("Alex Chang")
list.add("Jane Johns")
list.add("John Smith")
return list
}
const val mChannelId = "channel_email_1"
const val mChannelName = "Sample Email"
const val mChannelDescription = "Sample Email Notifications"
const val mChannelImportance = NotificationManager.IMPORTANCE_DEFAULT
const val mChannelEnableVibrate = true
const val mChannelLockscreenVisibility = NotificationCompat.VISIBILITY_PRIVATE
}
2、创建channel id
fun createBigPictureStyleNotificationChannel(context: Context):String{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//The id of the channel
val channelId : String = BigPictureStyleMockData.mChannelId
//The user-visible name of the channel
val channelName : CharSequence = BigPictureStyleMockData.mChannelName
val channelDescription : String = BigPictureStyleMockData.mChannelDescription
val channelImportance : Int = BigPictureStyleMockData.mChannelImportance
val channelEnableVibrate : Boolean = BigPictureStyleMockData.mChannelEnableVibrate
val channelLockscreenVisibility : Int = BigPictureStyleMockData.mChannelLockscreenVisibility
//Initializes NotificationChannel
val notificationChannel = NotificationChannel(channelId,channelName,channelImportance)
notificationChannel.description = channelDescription
notificationChannel.enableVibration(channelEnableVibrate)
notificationChannel.lockscreenVisibility = channelLockscreenVisibility
//Adds NotificationChannel to system
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
return channelId
}else{
return ""
}
}
3、创建notification id和notification manager
private val NOTIFICATION_BIG_IMAGE_ID = 889 private lateinit var mNotificationManagerCompat: NotificationManagerCompat mNotificationManagerCompat = NotificationManagerCompat.from(this@MainActivity)
4、创建big picture notification
val notificationChannelId : String =
NotificationUtil().createInboxStyleNotificationChannel(this)
val inboxStyle =
NotificationCompat.InboxStyle() //This title is slightly different than regular title
.setBigContentTitle(InboxStyleMockData.mBigContentTitle) //available
.setSummaryText(InboxStyleMockData.mSummaryText)
for(summary in InboxStyleMockData.mIndividualEmailSummary()){
inboxStyle.addLine(summary)
}
val mainIntent = Intent(this,MainActivity::class.java)
val mainPendingIntent = PendingIntent.getActivity(
this,
0,
mainIntent,
PendingIntent.FLAG_CANCEL_CURRENT
)
val notificationCompatBuilder = NotificationCompat.Builder(
applicationContext,
notificationChannelId
)
notificationCompatBuilder.setStyle(inboxStyle)
.setContentTitle(InboxStyleMockData.mBigContentTitle)
.setContentText(InboxStyleMockData.mContentText)
.setSmallIcon(R.drawable.ic_start_notification)
.setLargeIcon(
BitmapFactory.decodeResource(
resources,
R.drawable.ic_person
)
)
.setContentIntent(mainPendingIntent)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setColor(
ContextCompat.getColor(
applicationContext,
R.color.purple_500
)
)
.setSubText(InboxStyleMockData.mNumberOfNewEmails.toString())
.setCategory(Notification.CATEGORY_EMAIL)
.setPriority(InboxStyleMockData.mPriority)
.setVisibility(InboxStyleMockData.mChannelLockscreenVisibility)
for(name in InboxStyleMockData.mParticipants()){
notificationCompatBuilder.addPerson(name)
}
val notification = notificationCompatBuilder.build()
mNotificationManagerCompat.notify(NOTIFICATION_ID,notification)
运行结果:
点击按钮,弹出小弹框
打开通知栏,出现带图片的notification
点击notification回到主界面
注:
NotificationUtils代码:
package com.example.mynotification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
class NotificationUtil {
fun createInboxStyleNotificationChannel(context: Context):String{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//The id of the channel
val channelId : String = InboxStyleMockData.mChannelId
//The user-visible name of the channel
val channelName : CharSequence = InboxStyleMockData.mChannelName
val channelDescription : String = InboxStyleMockData.mChannelDescription
val channelImportance : Int = InboxStyleMockData.mChannelImportance
val channelEnableVibrate : Boolean = InboxStyleMockData.mChannelEnableVibrate
val channelLockscreenVisibility : Int = InboxStyleMockData.mChannelLockscreenVisibility
//Initializes NotificationChannel
val notificationChannel = NotificationChannel(channelId,channelName,channelImportance)
notificationChannel.description = channelDescription
notificationChannel.enableVibration(channelEnableVibrate)
notificationChannel.lockscreenVisibility = channelLockscreenVisibility
//Adds NotificationChannel to system
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
return channelId
}else{
return ""
}
}
fun createBigPictureStyleNotificationChannel(context: Context):String{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//The id of the channel
val channelId : String = BigPictureStyleMockData.mChannelId
//The user-visible name of the channel
val channelName : CharSequence = BigPictureStyleMockData.mChannelName
val channelDescription : String = BigPictureStyleMockData.mChannelDescription
val channelImportance : Int = BigPictureStyleMockData.mChannelImportance
val channelEnableVibrate : Boolean = BigPictureStyleMockData.mChannelEnableVibrate
val channelLockscreenVisibility : Int = BigPictureStyleMockData.mChannelLockscreenVisibility
//Initializes NotificationChannel
val notificationChannel = NotificationChannel(channelId,channelName,channelImportance)
notificationChannel.description = channelDescription
notificationChannel.enableVibration(channelEnableVibrate)
notificationChannel.lockscreenVisibility = channelLockscreenVisibility
//Adds NotificationChannel to system
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)
return channelId
}else{
return ""
}
}
}
MainActivity代码
package com.example.mynotification
import android.app.Notification
import android.app.PendingIntent
import android.content.Intent
import android.graphics.BitmapFactory
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity(), View.OnClickListener {
private val NOTIFICATION_ID = 888
private val NOTIFICATION_BIG_IMAGE_ID = 889
private lateinit var mNotificationManagerCompat: NotificationManagerCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mNotificationManagerCompat = NotificationManagerCompat.from(this@MainActivity)
val btnInboxStyleNotification = findViewById
MainActivity布局文件:



