基本通知
最基本、精简形式(也称为折叠形式)的通知会显示一个图标、一个标题和少量内容文本。
设置通知内容
[code] var builder = NotificationCompat.Builder(this, CHANNEL_ID).setSmallIcon(R.drawable.notification_icon).setContentTitle(\"My notification\").setContentText(\"Much longer text that cannot fit one line...\").setStyle(NotificationCompat.BigTextStyle().bigText(\"Much longer text that cannot fit one line...\")).setPriority(NotificationCompat.PRIORITY_DEFAULT)
- 小图标,通过 setSmallIcon() 设置。这是所必需的唯一用户可见内容。
- 标题,通过 setContentTitle() 设置。
- 正文文本,通过 setContentText() 设置。
- 通知优先级,通过 setPriority() 设置。优先级确定通知在 Android 7.1 和更低版本上的干扰程度。
创建渠道并设置重要性
必须先通过向 createNotificationChannel() 传递 NotificationChannel 的实例在系统中注册应用的通知渠道。
然后才能在 Android 8.0 及更高版本上提供通知。
[code] val name = getString(R.string.channel_name)val descriptionText = getString(R.string.channel_description)val importance = NotificationManager.IMPORTANCE_DEFAULTval channel = NotificationChannel(CHANNEL_ID, name, importance).apply {description = descriptionText}// Register the channel with the systemval notificationManager: NotificationManager =getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)
NotificationChannel 构造函数需要一个 importance,它会使用 NotificationManager 类中的一个常量。
此参数确定出现任何属于此渠道的通知时如何打断用户。
但还必须使用 setPriority() 设置优先级,才能支持 Android 7.1 和更低版本。
设置通知的点按操作
每个通知都应该对点按操作做出响应,通常是在应用中打开对应于该通知的 Activity。
为此,必须指定通过 PendingIntent 对象定义的内容 Intent,并将其传递给 setContentIntent()。
[code] // Create an explicit intent for an Activity in your appval intent = Intent(this, AlertDetails::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, CHANNEL_ID).setSmallIcon(R.drawable.notification_icon).setContentTitle(\"My notification\").setContentText(\"Hello World!\").setPriority(NotificationCompat.PRIORITY_DEFAULT)// Set the intent that will fire when the user taps the notification.setContentIntent(pendingIntent).setAutoCancel(true)
显示通知
[code] with(NotificationManagerCompat.from(this)) {// notificationId is a unique int for each notification that you must definenotify(notificationId, builder.build())}
显示效果
展开式通知
首先,使用创建通知中介绍的所有基本内容创建通知。
然后,使用一个样式对象调用 setStyle(),并提供与每个模板相对应的信息。
[code] 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()
通知跳转Activity
1. 在清单中,将以下属性添加到 <activity> 元素中
- android:taskAffinity=\”\”
与您将在代码中使用的 FLAG_ACTIVITY_NEW_TASK 标记结合使用,将此属性设置为空可以确保这类 Activity 不会进入应用的默认任务。具有应用默认相似性的任何现有任务都不会受到影响。
- android:excludeFromRecents=\”true\”
用于从“最近”中排除新任务,以免用户意外返回它。
2. 构建并发出通知
- 创建启动 Activity 的 Intent。
- 通过调用具有 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 标记的 setFlags(),将 Activity 设置为在新的空任务中启动。
- 通过调用 getActivity() 创建 PendingIntent。
[code] val notifyIntent = Intent(this, ResultActivity::class.java).apply {flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK}val notifyPendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
3. 然后,可以像往常一样将 PendingIntent 传递到通知中
[code] val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {setContentIntent(notifyPendingIntent)...}with(NotificationManagerCompat.from(this)) {notify(NOTIFICATION_ID, builder.build())}
最终完成的效果
通知栏
点击跳转