通知

通知是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。

通知的进阶技巧

  1. 播放声音
Notification notification = new NotificationCmopat.Builder(this)
        ...
        .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
        .build();
  1. 震动
Notification notification = new NotificationCmopat.Builder(this)
        ...
        .setVibrate(new long[] {0, 1000, 1000, 1000})//震动1秒静止1秒再震动1秒
        .build();

震动权限:

<uses-permission android:name="android.permission.VIBRATE" />
  1. LED闪烁
Notification notification = new NotificationCmopat.Builder(this)
        ...
        .setDefaults(NotifiationCompt.DEFAULT_ALL)
        .build();
  1. 通知的高级功能
    显示长文字,通过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();