Android Notification 的总结分析
概述
Android Notification 是 Android 系统中的一个提醒用户的机制。当应用程序需要提醒用户时,它可以创建一个 Notification 对象并在系统状态栏中显示。用户可以点击该 Notification 对象以打开应用程序或处理特定的任务。Android Notification 可以显示到应用程序在后台或者设备已锁定时。在本文中,我们将对 Android Notification 进行总结和分析。
Android Notification 的基本组成
- 通知标题及内容:通知的标题和内容告诉用户通知所涉及的信息。
- 时间戳:显示通知发布的时间(当然,你可以在通知后端设置)
- 通知图标:一个小图标,用于标识通知来源。
- 扩展内容:收件人可以下拉通知以获得完整内容,否则就只能看到标题和简短内容。
- 通知行为:通知可以设置一些特定的操作。例如,当用户点击通知时应该打开哪个 Activity 或打开一个 Web 页面。
Android Notification 的创建流程
- 创建 NotificationChannel 对象
- 构建 NotificationCompat.Builder 对象
- 设置通知内容
- 策略性解析 PendingIntent 对象
- 将通知发送到状态栏
示例1:基本的文本通知
以一个普通的文本通知作为示例
- 在 AndroidManifest.xml 文件中添加 Vibrate 和 WakeLock 权限:
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
- 在 MainActivity 中创建 NotificationChannel 和 NotificationCompat.Builder 对象:
private val CHANNEL_ID = "default"
private fun createNotificationChannel() {
// Create the NotificationChannel, but only on API 21+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = getString(R.string.channel_name)
val descriptionText = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
description = descriptionText
}
// Register the channel with the system
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
private fun sendNotification(messageBody: String) {
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, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle(getString(R.string.notification_title))
.setContentText(messageBody)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
with(NotificationManagerCompat.from(this)) {
// notificationId is a unique int for each notification that you must define
notify(0, builder.build())
}
}
- 在 onCreate 中调用 createNotificationChannel:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
createNotificationChannel()
}
- 在需要发送通知时调用 sendNotification :
sendNotification("This is the message body of the notification.")
示例2:添加扩展内容的通知
示例2 演示了如何向通知中添加扩展内容。
- 在 MainActivity 中创建 NotificationCompat.Builder 对象,并添加扩展内容
private fun sendNotificationWithTextAndPicture(messageBody: String, pictureUrl: String) {
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 notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle(getString(R.string.notification_title))
.setContentText(messageBody)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
// Add the picture
val picture =
BitmapFactory.decodeStream(URL(pictureUrl).openConnection().getInputStream())
notificationBuilder.setStyle(
NotificationCompat.BigPictureStyle()
.bigPicture(picture)
.bigLargeIcon(null)
)
with(NotificationManagerCompat.from(this)) {
// notificationId is a unique int for each notification that you must define
notify(0, notificationBuilder.build())
}
}
- 在需要发送通知时调用 sendNotificationWithTextAndPicture :
sendNotificationWithTextAndPicture(
"This is the message body of the notification with picture.",
"https://www.example.com/picture.png")
总结
本文总结了 Android Notification 的基本组成和创建流程,以及示范了两个常见的用例。在实践中,你可以根据自己的需求对通知进行自定义。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android notification 的总结分析 - Python技术站