美文网首页
如何在Android系统中显示和管理通知

如何在Android系统中显示和管理通知

作者: BlueSocks | 来源:发表于2022-10-18 17:23 被阅读0次

通常,在 Android 应用程序中,通知用于与用户就应用程序更新和提醒进行沟通。通过这种方式,当用户在应用的 UI 之外并允许快速交互(如删除电子邮件或回复消息)时,它们往往非常有用。

项目设置

首先,打开 Android Studio 并创建一个新项目,或者直接打开一个现有项目以向其添加通知功能。

无需特殊依赖项即可处理通知,只需核心 SDK 即可。

通知通道

通知通道是一种将应用程序发送的通知分组到可管理组中的方法。

从 Android 8.0及更高版本开始,通知需要归因于一个通道,对于每个通道,您可以设置应用于该特定通道中所有通知的视觉和声音行为。

这样,用户就可以更灵活地更改这些设置,并决定应用中的通知通道是否应具有侵入性、可见性等。

从开发人员的角度来看,在显示通知之前,应先创建一个通道。首先获取对NotificationManager 的引用。在此之后,您必须确保在Android 8.0或更高版本上运行 ,为此,您必须进行所需的检查,并在需要时创建频道并添加它。

下面是一个代码段,用于创建频道、自定义其行为,然后添加以下内容:

companion object {
        private const val NOTIFICATION_ID = 112
        private const val PRIMARY_CHANNEL_ID = "primary_notification_channel"
}

private lateinit var notificationManager: NotificationManager

private fun createNotificationChannel() {
        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                PRIMARY_CHANNEL_ID,
                "Messages",
                NotificationManager.IMPORTANCE_HIGH
            )

            channel.enableLights(true)
            channel.lightColor = Color.RED
            channel.enableVibration(true)
            channel.description = "Messages Notification"
            notificationManager.createNotificationChannel(channel)
        }
    }

显示您的第一条通知

要显示通知,您需要先构建它,因为通知是包含许多参数的东西。执行此操作的方法是通过 NotificationCompat.Builder

出于本教程的目的,我们将从相对简单的东西开始,例如标题,文本和基本图标。

生成完通知后,若要显示通知,可以使用NotificationManagerNotificationManagerCompat使代码更高效、更简洁、更清晰。

两者都需要一个通知对象(我们创建的那个)和一个标识此通知的通知 ID。这样,如果我们要更新或取消它,我们可以获得对它的引用。

下面是一个代码块,用于创建并显示通知:

// creating the notification and its parameters.
val builder = NotificationCompat.Builder(this, PRIMARY_CHANNEL_ID).apply {
                setSmallIcon(R.drawable.ic_android)
                setContentTitle("Notification Article")
                setContentText("Learn How To Manage And Display Notifications in Android")
                setPriority(NotificationCompat.PRIORITY_DEFAULT)
            }

// displaying the notification with NotificationManagerCompat.
with(NotificationManagerCompat.from(this)) {
     notify(NOTIFICATION_ID, builder.build())
}

/* or you can use the notification manager object.
notificationManager.notify(NOTIFICATION_ID, notification.build())
*/

Notification参数 生成通知时,可以使用对象的多个公共方法来自定义通知。以下是一些:

  • setContentTitle:设置将显示为通知标题(第一行)的文本。
  • setContentText:设置将显示在通知的第二行中的文本。
  • setAutoCance:将布尔值绕过此方法,表示是否希望在用户在通知面板中点击通知时自动取消通知。
  • setLargeIcon:要显示在通知右侧的位图。
  • setPriority:此方法用于设置通知的优先级,这表示通知对用户注意力的重要性。
  • setTimeoutAfter:设置应取消此通知的时间(如果尚未取消)。
  • setSmallIcon:设置将在通知中显示的图标。
  • setStyle:此方法允许您添加丰富的通知样式(如收件箱样式)。
  • addActions:此方法允许您使用文本向通知添加操作,文本是系统通常显示为带有自定义文本图标的按钮的可选图标。
  • setContentIntent:使用此方法在单击通知时提供发送的 。
  • setDeleteIntent:提供当用户从通知面板中清除通知时要发送的 。

更新和取消通知

有时,当事件发生时,通知需要更改或更新,在某些情况下,它需要被取消 , Android框架为这些情况提供了简单的功能:

  • 取消通知:调用NotificationManager``cancel()``cancelAll() 的方法来传递显示通知时使用的通知 ID。还可以调用该方法来取消应用程序生成的所有通知。

下面是显示如何取消通知的代码段:

private fun cancelNotification() {
        notificationManager.cancel(NOTIFICATION_ID)
}

  • 更新通知:更新通知与显示通知相同。您只需使用该对象创建另一个通知,然后要求builder``NotificationManager``NotificationManager 使用相同的通知 ID 为您显示该通知。这样,将知道使用新通知更新通知。

待定意向

有时,您希望在用户点击通知后执行某个操作,例如显示活动或启动后台服务,或者只是向广播接收器发送意向。

所有这些操作都需要一个意图。这是一个问题,我们不能在这里使用意图。

如果您想从应用程序启动活动,那根本不是问题。从你的应用使用意向进行调用时,你的应用具有执行此操作的权限。

当启动器(系统组件)尝试在没有所需权限的情况下启动您的活动时,会出现此问题。因此,我们需要你的应用可以提供给另一个应用的另一种意向,这称为挂起意向

因此,如果您为外部应用程序提供意图,它将使用自己的权限执行您的意图。但是,如果您为外部应用程序提供 ,则该应用程序将使用应用程序的权限执行您的意图。

您可以使用静态方法创建 ,具体取决于要启动的组件。在这些方法中,您应该像在正常情况下一样定义意图。您还可以添加标志和参数 ,这样,它们将充当要由外部应用程序使用的意向的包装器。

我们将创建一个PendingIntent``MainActivity,以便在点击通知后启动。以下是执行此操作的代码:

val intent = Intent(this, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        }

val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, 0)

val builder = NotificationCompat.Builder(this, PRIMARY_CHANNEL_ID).apply {
    setSmallIcon(R.drawable.ic_android)
    setContentIntent(pendingIntent)
    setContentTitle("Notification Article")
    setContentText("Learn How To Manage And Display Notifications in Android")
    setAutoCancel(true)
    setPriority(NotificationCompat.PRIORITY_DEFAULT)
}

with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

使用操作进行自定义

在了解如何使用PendingIntent从通知中触发操作后,您可以执行许多其他操作。

其中一项操作是在通知中添加按钮或操作,以便在用户点击进程后启动该流程,或者例如,假设您希望在用户点击通知中的删除操作后删除电子邮件。

为此,您需要两个主要内容:一个启动进程(在后台服务中或通过广播接收器),然后通过采用图标和字符串标题的方法将此意图传递给通知生成器。

下面是一个代码片段来演示:

val deleteIntent = Intent(this, DeleteBroadcastReceiver::class.java).apply {
                action = ACTION_DELETE
                putExtra(EXTRA_EMAIL_ID, EMAIL_ID)
}

val deletePendingIntent: PendingIntent =  PendingIntent.getBroadcast(this, 0, deleteIntent, 0)

val builder = NotificationCompat.Builder(this, PRIMARY_CHANNEL_ID).apply {
                setSmallIcon(R.drawable.ic_android)
                setContentTitle("Notification Article")
                setContentText("Learn How To Manage And Display Notifications in Android")
                setPriority(NotificationCompat.PRIORITY_DEFAULT)
                setContentIntent(pendingIntent)
                addAction(R.drawable.ic_delete, "Delete", deletePendingIntent)
              }

可展开的通知

如果你尝试显示的文本太大而无法放入正常大小的通知(如电子邮件)或显示用户在进入应用之前想要查看的大图像,则可以使通知可展开

实现此目的的方法是向通知添加样式,主要是BigTextStyleBigPictureStyle。这些是具有预定义行为的预定义样式,用于处理通知的可扩展性,具体取决于您尝试显示的内容。

添加这些样式是通过该方法完成的,该方法允许您向构建器对象指示要在其上使用特定样式。

使用BigTextStyle,您可以添加要显示的文本,如以下代码段中所示:

var notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_mail)
        .setContentTitle(emailObject.getSenderName())
        .setContentText(emailObject.getSubject())
        .setLargeIcon(emailObject.getSenderAvatar())
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText(emailObject.getSubjectAndSnippet()))
        .build()

对于BigPictureStyle ,您还需要再次指定样式和要展开的图像,如以下代码行所示:

var notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setLargeIcon(myBitmap)
        .setStyle(NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap)
                .bigLargeIcon(null))
        .build()

相关文章

网友评论

      本文标题:如何在Android系统中显示和管理通知

      本文链接:https://www.haomeiwen.com/subject/bthszrtx.html