通知(Notification)的简单使用
运行效果
创建通知
首先,代码如下,我们再慢慢说:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.send_notice);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_notice:
// 主要看这几句
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Notification")
.setContentText("This is Details!")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
manager.notify(SIMPLE_NOTIFICATION, notification);
break;
default:
break;
}
}
首先,你需要一个NotificationManager的实例对所有的通知进行管理。可以在Context中的getSystemService()函数得到。这个函数有一个字符串参数,用于确定是获得哪一个服务,使用常量Context.NOTIFICATION_SERVICE就可以得到实例了,其它的还有什么服务呢???还有很多很多服务
第二步就是构建通知的实例,这里使用一个NotificationCompat类的.Builder()方法(需要一个Context参数)进行构建.build()方法构建完成,我们可以在其中添加很多其它设置不同参数的方法,来自定义通知的内容。
为什么NotificationCompat类要使用support-v4库中的类,我看见support-v7库中也有这个类,它们之间有什么区别吗??目前,我还不清楚
不过,还是先看看目前我们要用的设置通知的方法吧
- setContentTitile 非必须的,标题
- setContentText 非必须的,正文,不能超过一行,多余的用省略号表示
- setWhen 非必须,通知创建的时间
- setSmallIcon 必须的,不然会出错。在状态栏显示的小图标
- setLargeIcon 非必须的,通知上的大图标
最后,使用第一步得到的NotificationManager的实例中的notify()方法,第一个参数是id,保证每次启动通知的ID都是不同的,第二个参数就是一个通知的实例。就可以启动通知了。
点击通知启动活动
目前我们显示的通知是不能点击的,想实现点击效果就必须学习新的东西,开始吧。
首先,NotificationCompat中有一个setContentIntent()方法可以让通知可以点击,这个方法需要传入一个PendingIntent参数,所以,需要了解一下PendingIntent是什么东西。
然后,我们就来看看这个PendingIntent,它与Intent很像,都是用来启动活动,广播和服务的,区别也很明显。就是它是只用在通知上,不是通知创建时就执行这个PendingIntent,而是通知被点击时,PendingIntent才会执行,这就是最大的不同了。
最后,怎么创建一个PendingIntent呢?使用PedningIntent的getActivity(),getBroadCasr(),getService()方法就可以得到对应的实例了,这几个方法有相同的参数,第一个参数是Context,第二个参数不知道是什么,一般传0就可以了,第三个参数是Intent,用来知道启动哪个活动,广播和服务,最后一个参数也不知道是什么,不过一般也是传0就可以了。
好了使用第一步的setContentIntent()方法将PendingIntent实例传入就可以实现通知的点击功能了。。。
代码如下 :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.send_notice);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_notice:
// 多出下面这两行
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Notification")
.setContentText("This is Details!")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent) // 还有这一行
.build();
manager.notify(1, notification);
break;
default:
break;
}
}
取消通知
当我们点击通知后,通知启动了一个活动,但是通知却没有消失,我们再次点击通知时,它又启动了一个活动,这可不行,根据之前,学习的活动的启动模式中的知识。以默认Standard模式启动同一个活动两次也是两个不同的活动。所以为了不出现这种情况,必须在通知被点击后就消失才行。。
方法1、在创建Notification中可以使用setAutoCanel()方法,参数是一个boolean的变量,表示是否使用自动取消通知(在点击后自动消失)。
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Notification")
.setContentText("This is Details!")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.setAutoCanel(true) // 自动取消通知
.build();
方法2、使用NotificationManager的实例的canel()方法也可以取消通知,需要传入一个id参数,对,就是上面说的保证每次通知都不同的那个id,这样才能确定取消的是哪个通知。
manager.canel(1); //也可以取消通知的显示(显式取消)
进阶使用通知
在创建通知时可以使用大量的设置方法来丰富自己的通知
setSound():设置铃声
setVibrate():设置震动
setLights():设置指示灯
setDefaults():对上面的设置使用默认设置
setStyle():设置通知的风格
setPriority():设置通知的重要等级(就像QQ弹出消息的那种通知)
这几个方法是比较常用的,大家需要使用时,可以去自己去查询资料。。