通知
通知是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。
通知的基本用法
首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法获取到。getSystemService()方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入Context.NOTIFICATION_SERVICE即可。因此,获取NotificationManager的实例就可以写成:
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
使用support-v4库中提供的NotificationCmopat类的构造器来创建Notification对象,就可以保证我们的程序在所有Android系统版本上都能正常工作了,代码如下:
Notification notification = new NotificationCompat.Builder(context)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmalllIcon(R.drawble.small_icon)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon))
.build();
只需要调用NotificationManager的nofity()方法就可以让通知显示出来了。notify()方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以写成:
manager.notify(1,notification);
通知的点击事件
要想实现通知的点击效果,我们还需要在代码中进行相应的设置,这就涉及了一个新的概念:PendingIntent,即延迟执行的Intent。
PendingIntent的用法同样很简单,它主要提供了几个静态方法用于获取PendingIntent的实例,可以根据需求来选择是使用getActivity()方法、getBroadcase()方法,还是getService()方法。这几个方法所接收的参数都是相同的,第一个参数依旧是Context,不用多做解释。第二个参数一般用不到,通常都是传入0即可。第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”。第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT这4种值可选,通常情况下这个参数传入0就可以了。代码如下:
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(context)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmalllIcon(R.drawble.small_icon)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon))
.setContentIntent(pi)
.build();
manager.notify(1,notification);
通知消失
让通知消失有两种方法,一种是在NotificationComp.Builder中再连缀一个setAutoCancel()方法,一种是显式地调用NotificationManager的cancel()方法将它取消,代码如下:
Notification notification = new NotificationCompat.Builder(this)
...
.setAutoCancel(true)
.build();
setAutoCancle()方法传入true,就表示当点击了这个通知的时候,通知会自动取消掉。
第二种写法如下:
NotificationManager manager = (NotificationManager) getSystemServicemanager.cancel(1);
1是通知的id。
通知的进阶技巧
- 播放声音
Notification notification = new NotificationCmopat.Builder(this)
...
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
.build();
- 震动
Notification notification = new NotificationCmopat.Builder(this)
...
.setVibrate(new long[] {0, 1000, 1000, 1000})//震动1秒静止1秒再震动1秒
.build();
震动权限:
<uses-permission android:name="android.permission.VIBRATE" />
- LED闪烁
Notification notification = new NotificationCmopat.Builder(this)
...
.setDefaults(NotifiationCompt.DEFAULT_ALL)
.build();
- 通知的高级功能
显示长文字,通过setStyle()方法,代码如下所示:
Notification notification = new NotificationCmopat.Builder(this)
...
.setStyle(new NotificationCompat.BigTextStyle().bigText("..."))
.build();
通知显示大图片:
Notification notification = new NotificationCmopat.Builder(this)
...
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.big_image)))
.build();