通常,在 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
出于本教程的目的,我们将从相对简单的东西开始,例如标题,文本和基本图标。
生成完通知后,若要显示通知,可以使用NotificationManager
或 NotificationManagerCompat
使代码更高效、更简洁、更清晰。
两者都需要一个通知对象(我们创建的那个)和一个标识此通知的通知 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)
}
可展开的通知
如果你尝试显示的文本太大而无法放入正常大小的通知(如电子邮件)或显示用户在进入应用之前想要查看的大图像,则可以使通知可展开。
实现此目的的方法是向通知添加样式,主要是BigTextStyle
或 BigPictureStyle
。这些是具有预定义行为的预定义样式,用于处理通知的可扩展性,具体取决于您尝试显示的内容。
添加这些样式是通过该方法完成的,该方法允许您向构建器对象指示要在其上使用特定样式。
使用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()
网友评论