Android——通知Notification

通知Notification

Android 8.0 引入了通知渠道,可以为要显示的每种通知类型创建用户可自定义的渠道,所有的通知都必须分配到相应的渠道。用户界面将通知渠道称之为通知类别。所以在使用通知时需要先判断Android系统,8.0以上的需要创建渠道,将通知放入特定渠道中,否则通知将不会出现,8.0一下的系统则不用创建渠道。

 

可以将创建渠道封装到一个方法中,再该方法中进行判断是否创建:

private String createNotificationChannel(String channelID, String channelNAME, int level) {

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

        NotificationManager manager = (NotificationManager)         getSystemService(NOTIFICATION_SERVICE);

        NotificationChannel channel = new NotificationChannel(channelID, channelNAME, level);

        manager.createNotificationChannel(channel);

        return channelID;

    } else {

        return null;

  }

}    

 

  • NotificationChannel为通知渠道,创建实例时接收三个参数NotificationChannel(String id, CharSequence name, int importance),第一个为渠道ID,第二个为渠道名称,第三个为通知的重要度,总共有六个:NotificationManager.IMPORTANCE_UNSPECIFIED、 NotificationManager.IMPORTANCE_NONE、NotificationManager.IMPORTANCE_MIN(低,不发出提示音,且不会在状态栏中显示)、NotificationManager.IMPORTANCE_LOW(中,不发出提示音)、NotificationManager.IMPORTANCE_DEFAULT(高,发出提示音)、NotificationManager.IMPORTANCE_HIGH(紧急,发出提示音,并以浮动通知的形式显示),一般只用后面四种,应用程序的通知管理内,重要程度也只有后面四种。
  • NotificationManager用来对通知进行管理,通过调用getSystemService()方法获取,该方法有一个字符串参数用于确定获取系统哪个服务。然后调用createNotificationChannel()方法创建通知渠道,接收一个NotificationChannel参数。

 

然后要做的就是创建通知了,通过NotificationCompat.Builder构造通知需要的信息,因为需要为通知设置相应的消息类别(渠道),所以构造方法采用接收两个参数的(只接收一个Context参数的官方不建议用了),第一个参数为Context,第二个参数为渠道ID。该构造方法在最终的build()方法之前可以连缀多个设置方法来设置该通知的各种信息。最后再调用NotificationManager的notify()方法就可以让通知显示出来了。

Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
String channelId = createNotificationChannel("my_channel_ID", "my_channel_NAME", NotificationManager.IMPORTANCE_HIGH);

Notification notification =new  NotificationCompat.Builder(this, channelId)
                        .setContentTitle("This is content title")
                        .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big)))
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                        .setContentIntent(pi)
                        .setAutoCancel(true)
                        .setVibrate(new long[]{0,1000,1000,1000})
                        .setPriority(NotificationCompat.PRIORITY_MAX)
                        .setSound(Uri.fromFile(new File("/system/medio/audio/ringtones/Luna.ogg")))
                        .build();
manager.notify(1, notification);

 

NotificationCompat. Builder (Context context, String channelId)方法后面可以连缀的设置方法:

  • setContentTitle (CharSequence title):设置通知标题
  • setContentText (CharSequence text):设置通知文本
  • setWhen (long when):设置事件发生的时间
  • setSmallIcon (IconCompat icon):设置要在通知的小图标,只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上。
  • setLargeIcon (Bitmap icon):设置通知的大图标,当下拉系统状态栏时,就可以看到设置的大图标了。
  • setContentIntent (PendingIntent intent):在单击通知时提供要发送的PendingIntent。
  • setAutoCancel (boolean autoCancel):设置此标志将使通知在用户单击面板时自动取消
  • setSound (Uri sound):设置在通知发出时的提示音
  • setVibrate (long[] pattern):设置通知发出时进行手机震动
  • setLights (int argb, int onMs, int offMs):设置希望设备上的LED闪烁的argb值以及速率
  • setDefaults (int defaults):当你不想进行那么多繁杂的设置时,使用这个方法可以设置默认通知选项

 

notify (int id, Notification notification)方法接收两个参数,第一个参数为id,要保证为每个通知指定的id都是不同的,第二个参数为Notification对象。

 

这里还为通知设置了点击后跳转的动作,这里使用PendingIntent来实现,PendingIntent和Intent有点相似,都可以用于启动活动、启动服务以及发送广播等,但Intent更倾向于去立即执行某个动作,而PendingIntent更倾向于在某个合适的时机去执行某个动作,所以也可以把PendingIntent简单的理解为延迟执行的Intent。

PendingIntent主要提供了几种静态方法用于获取PendingIntent的实例,可以根据需求来选择是使用getActivity()方法、getBroadcast()方法、还是getService()方法。这三个方法所接收的参数都是相同的,第一个参数是Conext,第二个参数是发送方的私有请求代码,一般用不到,通常都是传入0即可,第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”,第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT(指示此PendingIntent只能使用一次的标志)、FLAG_NO_CREATE(指示如果所描述的PendingIntent不存在,则只返回NULL而不是创建它。)、FLAG_CANCEL_CURRENT(指示如果所描述的PendingIntent已经存在,则应在生成新PendingIntent之前取消当前的PendingIntent。)、FLAG_UPDATE_CURRENT(指示如果所描述的PendingIntent已经存在,则保留它,但将其额外的数据替换为这个新意图中的内容。)这4种值可选,通常情况下这个参数传入0就可以了。

 

通知的高级功能:

setStyle (NotificationCompat.Style style):这个方法可以构造出富文本的通知内容,也就是说通知中不光可以有文字和图标,还可以包含更多的东西。该方法接收一个NotificationCompat.Style参数,这个参数就是用来构建具体的富文本信息的,如长文字、图片等。

如果我们使用setContentText()方法设置显示长文本,则只会显示一行,后面的会用省略号代替,如果想要显示长文本的所有内容,就可以使用setStyle()方法,先在setStyle()方法中创建一个NotificationCompat.BigTextStyle()对象,这个对象就是用于封装长文字信息的,然后调用它的bigText()方法将文字内容传入就可以了。

setStyle(new NotificationCompat.BigTextStyle().bigText("如果我们使用setContentText()方法设置显示长文本,则只会显示一行,后面的会用省略号代替,如果想要显示长文本的所有内容,就可以使用setStyle()方法,先在setStyle()方法中创建一个NotificationCompat.BigTextStyle()对象,这个对象就是用于封装长文字信息的,然后调用它的bigText()方法将文字内容传入就可以了。"))

效果:

 

 

 

 

 

如果想在通知里显示大图片,则在setStyle()方法中创建一个NotificationCompat.BigPictureStyle()对象,这个对象就是用于设置大图片的,然后调用它的bigPicture()方法将图片传入,因为bigPicture()方法接收的参数为Bitmap对象,所以我们还需要通过BitmapFactory的decodeResource()方法将图片解析成Bitmap对象再传入到bigPicture()方法中。

setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big)))

效果:

 

 

 

 

posted @ 2020-07-28 22:11  木霖  阅读(1272)  评论(0编辑  收藏  举报