Jetpack Compose中使用Notification

在这里插入图片描述
发送通知相关的主要有两个关键的类 NotificationCompat.BuilderNotificationManagerCompat
为方便使用,首先定义一个扩展工具类来管理通知

const val MAIN_CHANNEL_ID = "MainChannel ID"
const val MAIN_CHANNEL = "MainChannel"

fun Context.buildNotification(
    id: Int,
    title: String,
    message: String,
    action: String? = null,
    actionMessage: String? = null,
    visibility: Int = VISIBILITY_PUBLIC,
    activityIntent: Intent? = null,
    isDeepLink: Boolean = false
): Notification {
   
    val notification = Notification(id, title, message, action, actionMessage,
        visibility, activityIntent,isDeepLink)
    notification.builder = notification.builder(this)
    notification.manager = getNotificationManager()
   return notification
}

data class Notification(
    val id: Int,
    var title: String,
    var message: String,
    var action: String? = null,
    var actionMessage: String? = null,
    var visibility: Int = VISIBILITY_PUBLIC,
    var activityIntent: Intent? = null,
    val isDeepLink: Boolean = false,
    var builder: Builder? = null,
    var manager: NotificationManagerCompat? = null
)

fun Notification.show(): Notification {
   
    builder?.let {
    manager?.notify(id, it.build()) }
    return this
}

fun Notification.update(
    context: Context,
    titleNew: String? = null,
    messageNew: String? = null,
    action1: String? = null,
    visibleType: Int = VISIBILITY_PUBLIC
): Notification  {
   
    titleNew?.let {
    title = titleNew }
    messageNew?.let {
    message = messageNew}
    action1?.let {
    action = action1  }
    if (visibleType != visibility) visibility = visibleType
    manager?.notify(id, builder(context).build())
    return this
}

fun Notification.builder(context: Context): Builder {
   
    val builder = Builder(context, MAIN_CHANNEL_ID)
        .setContentTitle(title)
        .setContentText(message)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setLargeIcon(context.bitmap(R.drawable.ic_head3,200, 200))
        .setPriority(PRIORITY_DEFAULT)
        .setVisibility(visibility)
        .setAutoCancel(true)
    if (visibility == VISIBILITY_PRIVATE) {
   
        builder.setPublicVersion(
            Builder(context, MAIN_CHANNEL_ID)
                .setContentTitle("收到一条新的消息")
                .setContentText("请解锁屏幕后查看!")
                .build()
        )
    }
    val flg = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0
    action?.let {
   
        val intent = Intent(context, NotificationReceiver::class.java).apply {
   
            putExtra(KEY_MESSAGE, actionMessage)
            putExtra(KEY_NOTIFICATION_ID, id)
        }
        PendingIntent.getBroadcast(context, 0, intent, flg)
    }?.let {
    builder.addAction(0, action, it) }

    if (isDeepLink) {
   
        activityIntent?.let {
   
            TaskStackBuilder.create(context).run {
   
                addNextIntentWithParentStack(it)
                getPendingIntent(1, flg)
            }
        }?.let {
    builder.setContentIntent(it) }
    } else {
   
        activityIntent?.let {
    PendingIntent.getActivity(context, 1, it, flg) }
            ?.let {
    builder.setContentIntent(it) }
    }
    return builder
}

fun Contex
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值