Android 单挑通知在几秒钟后消失
Android Heads-up notification disappears after a few seconds
我希望通知不会在几秒钟后消失。
所以我创建了这样的通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.cast_ic_notification_small_icon)
.setDefaults(Notification.FLAG_ONGOING_EVENT)
.setPriority(Notification.PRIORITY_HIGH)
.setContentTitle(notificationDetails.getSubject())
.setContentText(notificationDetails.getMessage())
.setColor(context.getResources().getColor(R.color.colorPrimary))
.setOngoing(true);
并设置 FLAG_ONGOING_EVENT 和方法 setOngoing(true)。
但几秒钟后通知继续消失。
我希望通知仅在用户单击时消失。
谢谢。
无法更改 heads-up 通知的持续时间它设置在 OS 级别取决于 OS 它提供了多少时间。
无法更改持续时间。否则它会干扰队列中待显示的其他 heads-up 通知。
实际上可以使提醒通知持久化。诀窍是使用 setFullScreenIntent
。如果您不希望您的通知具有全屏版本,您可以使用不会实际启动任何 activity 的虚拟意图,如下所示:
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(), 0);
notificationBuilder.setFullScreenIntent(pendingIntent, true);
这是一个 hack,但这种行为有一定道理。如果某个应用试图显示全屏通知,那么它一定是一个重要事件,例如闹钟或 phone 电话。如果 phone 决定不显示全屏通知,在用户采取行动之前,它可能仍会显示一些持久的内容。
这适用于我测试过的 phones,但没有记录行为,因此不能保证。
您可以使用:
notificationBuilder.setFullScreenIntent(pendingIntent, true)
你还必须使用这些:
val tempChannel = NotificationChannel(tempChannelId, "temp channel",
NotificationManager.IMPORTANCE_HIGH) // Setting to high is important
tempChannel.enableVibration(true)
...
notificationBuilder.setAutoCancel(false)
notificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX) // PRIORITY_HIGH works too
notificationBuilder.setVibrate(LongArray(0)) // For older devices we need to add vibration or sound for the Heads-Up notification. This line will not make it vibrate, you can use another pattern, or default, if you want it to vibrate
notificationBuilder.setFullScreenIntent(pendingIntent, true)
重要提示:
在大多数设备上,这会在屏幕顶部显示通知,覆盖所有内容并停留在那里。
但在某些设备上,这将立即启动通知中的待处理 intent。 (如华为)
为了解决这个问题,我们可以为 fullScreenIntent 使用一个虚拟的 pendingIntent,它以相同的方式显示通知,只是没有 notificationBuilder.setFullScreenIntent(pendingIntent, true);
这将作为后备,因此通知会出现,但会缩小大约 5 秒后自动显示到状态栏。
val servicePendingIntent = PendingIntent.getService(context, 0, Intent(context, FullScreenIntentService::class.java), 0)
val mainActivityPendingIntent = PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), PendingIntent.FLAG_ONE_SHOT)
...
notificationBuilder.setContentIntent(mainActivityPendingIntent)
notificationBuilder.setFullScreenIntent(servicePendingIntent, true)
其中:
class FullScreenIntentService : Service() {
override fun onCreate() {
super.onCreate()
showNotificationHereTheSameWayJustWithoutSetFullScreenIntent()
stopSelf()
}
override fun onBind(intent: Intent?): IBinder? = null
}
并且不要忘记在 AndroidManifest 中注册该服务。
.setFullScreenIntent(fullScreenPendingIntent, true)
要保持提示通知,您需要添加全屏 intent
在荣耀和华为设备上发现了这个问题。
您可以尝试使用 setFullScreenIntent
并向 AndroidManifest.
添加权限来修复它
代码:
PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setFullScreenIntent(pIntent, true);
AndroidManifest.xml:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
我希望通知不会在几秒钟后消失。 所以我创建了这样的通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.cast_ic_notification_small_icon)
.setDefaults(Notification.FLAG_ONGOING_EVENT)
.setPriority(Notification.PRIORITY_HIGH)
.setContentTitle(notificationDetails.getSubject())
.setContentText(notificationDetails.getMessage())
.setColor(context.getResources().getColor(R.color.colorPrimary))
.setOngoing(true);
并设置 FLAG_ONGOING_EVENT 和方法 setOngoing(true)。
但几秒钟后通知继续消失。 我希望通知仅在用户单击时消失。 谢谢。
无法更改 heads-up 通知的持续时间它设置在 OS 级别取决于 OS 它提供了多少时间。
无法更改持续时间。否则它会干扰队列中待显示的其他 heads-up 通知。
实际上可以使提醒通知持久化。诀窍是使用 setFullScreenIntent
。如果您不希望您的通知具有全屏版本,您可以使用不会实际启动任何 activity 的虚拟意图,如下所示:
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(), 0);
notificationBuilder.setFullScreenIntent(pendingIntent, true);
这是一个 hack,但这种行为有一定道理。如果某个应用试图显示全屏通知,那么它一定是一个重要事件,例如闹钟或 phone 电话。如果 phone 决定不显示全屏通知,在用户采取行动之前,它可能仍会显示一些持久的内容。
这适用于我测试过的 phones,但没有记录行为,因此不能保证。
您可以使用:
notificationBuilder.setFullScreenIntent(pendingIntent, true)
你还必须使用这些:
val tempChannel = NotificationChannel(tempChannelId, "temp channel",
NotificationManager.IMPORTANCE_HIGH) // Setting to high is important
tempChannel.enableVibration(true)
...
notificationBuilder.setAutoCancel(false)
notificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX) // PRIORITY_HIGH works too
notificationBuilder.setVibrate(LongArray(0)) // For older devices we need to add vibration or sound for the Heads-Up notification. This line will not make it vibrate, you can use another pattern, or default, if you want it to vibrate
notificationBuilder.setFullScreenIntent(pendingIntent, true)
重要提示:
在大多数设备上,这会在屏幕顶部显示通知,覆盖所有内容并停留在那里。
但在某些设备上,这将立即启动通知中的待处理 intent。 (如华为)
为了解决这个问题,我们可以为 fullScreenIntent 使用一个虚拟的 pendingIntent,它以相同的方式显示通知,只是没有 notificationBuilder.setFullScreenIntent(pendingIntent, true);
这将作为后备,因此通知会出现,但会缩小大约 5 秒后自动显示到状态栏。
val servicePendingIntent = PendingIntent.getService(context, 0, Intent(context, FullScreenIntentService::class.java), 0)
val mainActivityPendingIntent = PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), PendingIntent.FLAG_ONE_SHOT)
...
notificationBuilder.setContentIntent(mainActivityPendingIntent)
notificationBuilder.setFullScreenIntent(servicePendingIntent, true)
其中:
class FullScreenIntentService : Service() {
override fun onCreate() {
super.onCreate()
showNotificationHereTheSameWayJustWithoutSetFullScreenIntent()
stopSelf()
}
override fun onBind(intent: Intent?): IBinder? = null
}
并且不要忘记在 AndroidManifest 中注册该服务。
.setFullScreenIntent(fullScreenPendingIntent, true)
要保持提示通知,您需要添加全屏 intent
在荣耀和华为设备上发现了这个问题。
您可以尝试使用 setFullScreenIntent
并向 AndroidManifest.
代码:
PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setFullScreenIntent(pIntent, true);
AndroidManifest.xml:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />