新增 handsUp通知
This commit is contained in:
parent
11a091a725
commit
b59b858352
|
|
@ -8,6 +8,7 @@ import android.graphics.BitmapFactory
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.widget.RemoteViews
|
import android.widget.RemoteViews
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import com.ama.core.architecture.util.permission.PermissionUtil
|
import com.ama.core.architecture.util.permission.PermissionUtil
|
||||||
|
|
@ -278,6 +279,126 @@ class NotificationUtil private constructor() {
|
||||||
|
|
||||||
showNotification(notificationId, notification)
|
showNotification(notificationId, notification)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示应用在后台时的顶部悬浮通知(Heads-up Notification)
|
||||||
|
* 此方法会自动处理Android版本的兼容性
|
||||||
|
*
|
||||||
|
* @param channelId 通知渠道ID(Android 8.0+必须)
|
||||||
|
* @param channelName 通知渠道名称(Android 8.0+必须)
|
||||||
|
* @param title 通知标题
|
||||||
|
* @param content 通知内容
|
||||||
|
* @param smallIcon 小图标资源ID
|
||||||
|
* @param intent 点击通知后要执行的Intent(可选)
|
||||||
|
* @param useFullScreenIntent 是否使用全屏意图(来电等高优先级场景)
|
||||||
|
* @param notificationId 通知ID
|
||||||
|
*/
|
||||||
|
fun showHeadsUpNotification(
|
||||||
|
channelId: String,
|
||||||
|
channelName: String,
|
||||||
|
title: String,
|
||||||
|
content: String,
|
||||||
|
smallIcon: Int,
|
||||||
|
intent: Intent? = null,
|
||||||
|
useFullScreenIntent: Boolean = false,
|
||||||
|
notificationId: Int = System.currentTimeMillis().toInt()
|
||||||
|
) {
|
||||||
|
// 1. 确保初始化
|
||||||
|
if (!this::context.isInitialized) {
|
||||||
|
throw IllegalStateException("NotificationUtil must be initialized first")
|
||||||
|
}
|
||||||
|
|
||||||
|
val builder = NotificationCompat.Builder(context, channelId)
|
||||||
|
|
||||||
|
// 2. 设置通知基本内容
|
||||||
|
builder.setContentTitle(title)
|
||||||
|
.setContentText(content)
|
||||||
|
.setSmallIcon(smallIcon)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setWhen(System.currentTimeMillis())
|
||||||
|
|
||||||
|
// 3. 处理点击意图
|
||||||
|
val pendingIntent = intent?.let {
|
||||||
|
PendingIntent.getActivity(context, 0, it, PendingIntent.FLAG_IMMUTABLE)
|
||||||
|
}
|
||||||
|
pendingIntent?.let { builder.setContentIntent(it) }
|
||||||
|
|
||||||
|
// 4. 版本兼容性配置 - 这是触发Heads-up的关键
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
// Android 8.0+ 使用通知渠道
|
||||||
|
createHeadsUpNotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
|
||||||
|
// 设置高重要性(会触发顶部悬浮)
|
||||||
|
builder.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||||
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
// Android 5.0-7.1 使用优先级设置
|
||||||
|
builder.setPriority(NotificationCompat.PRIORITY_MAX)
|
||||||
|
// 添加声音和振动确保触发顶部悬浮
|
||||||
|
builder.setDefaults(NotificationCompat.DEFAULT_ALL)
|
||||||
|
} else {
|
||||||
|
// Android 5.0以下版本不支持Heads-up,使用普通高优先级通知
|
||||||
|
builder.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||||
|
builder.setDefaults(NotificationCompat.DEFAULT_ALL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 可选:全屏意图(用于最高优先级场景)
|
||||||
|
if (useFullScreenIntent && pendingIntent != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
builder.setFullScreenIntent(pendingIntent, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. 发送通知
|
||||||
|
showNotification(notificationId, builder.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建用于顶部悬浮的高重要性通知渠道(Android 8.0+)
|
||||||
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
private fun createHeadsUpNotificationChannel(channelId: String, channelName: String, importance: Int) {
|
||||||
|
// 检查是否已存在相同ID的渠道,避免重复创建
|
||||||
|
if (notificationManager.getNotificationChannel(channelId) != null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val channel = NotificationChannel(
|
||||||
|
channelId,
|
||||||
|
channelName,
|
||||||
|
importance
|
||||||
|
).apply {
|
||||||
|
description = "应用在后台时的重要通知,会以悬浮形式显示"
|
||||||
|
enableLights(true)
|
||||||
|
lightColor = Color.RED
|
||||||
|
enableVibration(true)
|
||||||
|
vibrationPattern = longArrayOf(0, 250, 250, 250)
|
||||||
|
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
|
||||||
|
// 设置锁定屏幕上的可见性
|
||||||
|
}
|
||||||
|
|
||||||
|
notificationManager.createNotificationChannel(channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun showNotification(notificationId: Int = System.currentTimeMillis().toInt(), notification: Notification) {
|
private fun showNotification(notificationId: Int = System.currentTimeMillis().toInt(), notification: Notification) {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue