Tip1:通知可以在活动里创建,可以在广播接收器里面创建,也可以在服务里面创建,而相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入后台的时候我们才需要通知。
首先熟悉一下通知的创建步骤:
1、由于我们需要一个NotificationManager来管理通知,调用Context的getSystemService()方法来获取到。
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
2、使用一个Builder构造器创建Notification对象。【在这里要注意一个问题:API不稳定。解决方案就是用support库中提供了一个NotificationCompat类,使用这个类的构造器Builder来创建Notification对象,就可以保证在所有的Android版本上都能够正常的工作了】
Notification notification = new NotificationCompat.Builder(context).build();
3、连缀任意多的设置方法来创建一个丰富的Notification对象。基础设置如下:
Notification notification = new NotificationCompat.Builder(Context)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.small.icon)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon))
.build();
- setContentTitle:指定通知的标题内容,下拉系统状态栏可以直观看到这部分内容。
- setContentText:指定通知的正文内容,下拉系统状态栏可以直观看到这部分内容。
- setWhen:指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。
- setSmallIcon:设置通知的小图标,只能使用纯alpha图层的图片进行设置,会显示在系统状态栏上。
- setLargeIcon:设置通知的大图标,当下拉系统状态栏时就可以看到设置的大图标了。
4、设置完成之后,我们就要将其显示出来。在这里我们只需要调用NotificationManager的notify()方法就可以让通知显示出来了。
manager.notify(1,notification);
public void notify(int id, Notification notification) { notify(null, id, notification); }
通过查看notify源码,了解notify()方法接收两个参数。第一个参数是id,要保证每个通知所指定的id都不同;第二个参数是Notification对象,我们直接将自己创建好的Notification对象传入即可。
但是此时的通知点击是没有任何效果的,我们经常使用的大家都知道,我们在平常使用手机过程中,点击通知可以直接跳转到应用程序的Activity,那么在这里我们也设置一下。在设置跳转时,就需要我们了解一下PendingIntent。
PendingIntent,听名字就和Intent有些类似,作用也有些相似。比如它们都可以去指明某一个“意图”,都可以用来启动活动、启动服务以及发送广播等。不同的是,Intent更倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作【可以把PendingIntent理解为一个延迟执行的Intent】。
PendingIntent的用法:它主要提供了几个静态方法用于获取PendingIntent实例,根据需求选择使用getActivity()方法、getService()方法,还是getBroadcast()方法。不过这几个方法所接收的参数都是相同的。
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, @Flags int flags) { return getActivity(context, requestCode, intent, flags, null); }
第一个参数依旧是Context;
第二个参数我们一般都传入0;
第三个参数是一个Intent对象,通过这个对象可以构建出PendingIntent的“意图”;
第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANAEL_CURRENT、FLAG_UPDATE_CURRENT,通常情况下传入0即可。
在这里我们只需要将Intent对象传入PendingIntent对象中,添加到设置中即可。如下:
Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
这样子就完成了对通知点击事件的设置。
但是当我们点击进入跳转页面后,发现了一个问题:通知图标并没有消息。这个和我们平常的认知并不一样,当我们点击进入该活动后,状态栏中的通知应该消失了呀,那么接下来我们就针对这个问题设置一下。
第一个方法:在NotificationCompat.Builder中再连缀一个setAutoCancel()方法。
.setContentIntent(pi) .setAutoCancel(true) .build();
第二种方法:显式地调用NotificationManager的canael()方法将它取消。
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send_notice = (Button) findViewById(R.id.send_inform); send_notice.setOnClickListener(this); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(1);
当时给通知设置指定的id为1,此处指明删除id为1的通知。
Tip2:上面我们学习了通知的一些基础知识,接下来我们介绍一些API来创建出更加多样的通知效果。
1、【设置音频】setSound()方法:接收一个Uri参数,所以在指定音频文件时还需要先获取到音频文件对应的URI。
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Lina.ogg")))
.build();
2、【设置震动】setVibrate()方法:长整型的数组,用于设置手机静止和震动的时长,以毫秒为单位。【下标为0的值表示手机静止的时长,下标为1的值表示手机震动的时长,以此类推....】
.setVibrate(new long[]{0,1000,1000,1000})
.build();
不过,想要控制手机振动还需要生命权限,因此我们需要在AndroidManifest.xml文件中加入如下声明:
3、【设置闪光灯】setLights()方法:第一个参数用于指定LED灯的颜色;第二个参数用于指定LED灯亮起的时长;第三个参数用于指定LED暗去的时长,也是以毫秒为单位的。
.setLights(Color.GREEN,1000,1000)
.build();
如果想使用通知的默认效果,可以按照如下写法:
.setDefaults(NotificationCompat.DEFAULT_ALL)
.build();
Tip3:上面学习了一些简单的API用法,接下来我们学习更加强大的API的用法,构建出更加丰富的通知效果。
1、setStyle()方法:允许构建出富文本的通知内容。接收一个NotificationCompat.Style参数,用来构建具体的富文本信息的。
(1)设置富文本:
.setStyle(new 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."))
(2)设置大图片:
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)))
2、setPriority()方法:设置通知的重要程度,接收一个整形参数用于设置这条通知的重要程度。
PRIORITY_DEFAULT:默认的重要程度,和不设置相同效果。
PRIORITY_MIN:最低的重要程度,只会在特定的场景才会显示这条通知。比如用户下拉状态栏时。
PRIORITY_LOW:较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排在更重要的通知之后。
PRIORITY_HIGH:较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置。
PRIORITY_MAX:最高的重要程度,这类通知消息必须要让用户立即看到,甚至需要用户做出响应操作。
.setPriority(NotificationCompat.PRIORITY_MAX)