发送通知

消息通知可以在Activity、BroadcastReceiver、service中创建,但是无论在哪创建,整体步骤基本一样。Android中使用通知渠道来开启通知功能,通知渠道一旦设定就不能再更改,所以创建通知渠道的时候最好进行仔细的分类。在创建好渠道之后,Notification就通过渠道进行发送。在Android中使用通知一般分为四个步骤。

第一步,创建渠道并创建NotificationManager以管理通知渠道。

此处的as是强制类型转换。因为Android8.0才新增通知功能,所以要进行版本判断, Build.VERSION_CODES.O代表了Android8.0版本,创建channel的NotificationChannel方法传入了三个参数,分别是channelId(渠道ID,随便写,只要唯一就行)、channelName(渠道名称,给用户看的,随便写,用户能看懂就行)、importance(重要程度,谨慎使用,以骚扰用户,主要有IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN这几种,不同等级的消息会以不同的形式推送给用户),然后把这个渠道添加到manager中方便管理。

val manager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
   if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val channel=NotificationChannel(channelId,channelName,importance)
            manager.createNotificationChannel(channel)
     }

第二步,使用一个Builder构造器来创建一个Notification对象,这里我们选择NotificationCompat类的构造器来创建对象。

这个构造器需要两个参数context(上下文)、channelId(渠道ID,要跟上面的一致,不然不知道通过哪个渠道发送),最后调用build方法创建。

val notification=NotificationCompat.Builder(context,channelId).build()

第三步,在执行Notification对象的build方法之前对通知的内容进行补充,以丰富通知消息。

填充消息内容,丰富通知内容,可以设置标题、文本内容、状态栏显示图标、下拉通知栏图标、最后调用build方法完成创建。

val notification=NotificationCompat.Builder(context,channelId)
            .setContentTitle("this is a notification")
            .setContentText("this is text")
            .setSmallIcon(R.drawable.small_icon)
            .setLargeIcon(BitmapFactory.decodeResource(resources,R.drawable.Large_icon))
            .build()
        }

第四步,激活通知消息。

使用manager的notify方法激活消息即可发送。该方法需要两个参数,此处 1 (代表消息ID,随便写,唯一就行),notification就是我们上面写的那个通知消息。

manager.notify(1,notification)

点击通知进入页面

要实现点击消息进入某个页面的功能还要用到PendingIntent。它和Intent类似,只是intent是立即执行,而PendingIntent是在合适的时机执行。我们使用PendingIntent的getActivity方法来完成点击传送事件,该方法有四个参数,第一个参数是上下文、第二个(我也不知道是啥,一般用不到,传入0就行),第三个是我们构建的Intent,第四个用于PendingIntent的行为有4种值,具体用到的时候可以在文档中查看,一般传0就行。在消息中加上.setContextIntent(pi)将该事件写到消息中,当点击之后,就会传送到我们Intent引导的页面中去。然后在加上.setAutoCancel(true),使消息被点击之后能够自动消失。

val intent=Intent(this,NotificationActivity::class.java)
val pi=PendingIntent.getActivity(this,0,intent,0)
val notification=NotificationCompat.Builder(context,channelId)
            .setContentTitle("this is a notification")
            .setContentText("this is text")
            .setSmallIcon(R.drawable.small_icon)
            .setLargeIcon(BitmapFactory.decodeResource(resources,R.drawable.Large_icon))
            .setContextIntent(pi)
            .setAutoCancel(true)
            .build()
        }

构建富文本消息通知

这就需要用到setStyle方法了。

val intent=Intent(this,NotificationActivity::class.java)
val pi=PendingIntent.getActivity(this,0,intent,0)
val notification=NotificationCompat.Builder(context,channelId)
    .setContentTitle("this is a notification")
    .setContentText("this is text")
    .setSmallIcon(R.drawable.small_icon)
    .setLargeIcon(BitmapFactory.decodeResource(resources,R.drawable.Large_icon))
    .setContextIntent(pi)
    .setAutoCancel(true)
    .setStyle(NotificationCompat.BigTextStyle().bigText("Learn how to build notifications, send and sync data, and use voice actions. Get the official Android IDE and developer tools to build apps for Android."))
    .setStyle(NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(resources, R.drawable.big_image)))
    .build()
}

在build方法之前使用setStyle方法添加显示一段文本,一个大图片,这样就可以使构建富文本了,像这样。

Android EventBus发送自身 fragment android发通知_构造器