通知(Notification)

来源:互联网 发布:怎样注册淘宝账户 编辑:程序博客网 时间:2024/05/21 08:59

通知的用法还是比较灵活的,既可以在活动里创建,也可以在广播接收器里创建,当然还可以在下一章中我们即将学习的服务里创建。相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。
创建通知的详细步骤:
首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法获取到。getSystemService()方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入Context.NOTIFICATION_SERVICE即可:

NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

接下来需要创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们可以使用它的有参构造函数来进行创建。Notification的有参构造函数接收三个参数,第一个参数用于指定通知的图标,比如项目的res/drawable目录下有一张icon.png图片,那么这里就可以传入R.drawable.icon。第二个参数用于指定通知的ticker内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。第三个参数用于指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。因此,创建一个Notification对象就可以写成:

Notification notification = new Notification(R.drawable.icon, "This is ticker text",System.currentTimeMillis());

创建好了Notification对象后,我们还需要对通知的布局进行设定,这里只需要调用Notification的setLatestEventInfo()方法就可以给通知设置一个标准的布局。这个方法接收四个参数,第一个参数是Context,这个没什么好解释的。第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。第四个参数我们暂时还用不到,可以先传入null。因此,对通知的布局进行设定就可以写成:

notification.setLatestEventInfo(context, "This is content title", "This is content text", null);

以上工作都完成之后,只需要调用NotificationManager的notify()方法就可以让通知显示出来了。notify()方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以写成:

manager.notify(1, notification);

要想实现通知的点击效果,我们还需要在代码中进行相应的设置,这就涉及到了一个新的概念,PendingIntent。Intent更加倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以,也可以把PendingIntent简单地理解为延迟执行的Intent。
PendingIntent的用法同样很简单,它主要提供了几个静态方法用于获取PendingIntent的实例,可以根据需求来选择是使用getActivity()方法、getBroadcast()方法、还是getService()方法。这几个方法所接收的参数都是相同的,第一个参数依旧是Context,不用多做解释。第二个参数一般用不到,通常都是传入0即可。第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”。第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_ CURRENT这四种值可选,每种值的含义你可以查看文档,我就不一一进行解释了。
对PendingIntent有了一定的了解后,我们再回过头来看一下Notification的setLatestEventInfo()方法。刚才我们将setLatestEventInfo()方法的第四个参数忽略掉了,直接传入了null,现在仔细观察一下,发现第四个参数正是一个PendingIntent对象。因此,这里就可以通过PendingIntent构建出一个延迟执行的“意图”,当用户点击这条通知时就会执行相应的逻辑。

NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawable. ic_launcher, "This is ticker text", System.currentTimeMillis());Intent intent = new Intent(this, NotificationActivity.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);notification.setLatestEventInfo(this, "This is content title", "This is content text", pi);manager.notify(1, notification);manager.cancel(1);

可以看到,这里我们在cancel()方法中传入了1,这个1是什么意思呢?还记得在创建通知的时候给每条通知指定的id吗?当时我们给这条通知设置的id就是1。因此,如果你想要取消哪一条通知,就在cancel()方法中传入该通知的id就行了。

通知的高级技巧

观察Notification这个类,你会发现里面还有很多我们没有使用过的属性。先来看看sound这个属性吧,它可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来。sound这个属性是一个Uri对象,所以在指定音频文件的时候还需要先获取到音频文件对应的URI。比如说,我们手机的/system/media/audio/ringtones目录下有一个Basic_tone.ogg音频文件,那么在代码中这样就可以这样指定:

Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/ Basic_tone.ogg"));notification.sound = soundUri;

除了允许播放音频外,我们还可以在通知到来的时候让手机进行振动,使用的是vibrate这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长,以此类推。所以,如果想要让手机在通知到来的时候立刻振动1秒,然后静止1秒,再振动1秒,代码就可以写成:

long[] vibrates = {0, 1000, 1000, 1000};notification.vibrate = vibrates;

不过,想要控制手机振动还需要声明权限的。因此,我们还得编辑AndroidManifest.xml文件,加入如下
……

notification.ledARGB = Color.GREEN;notification.ledOnMS = 1000;notification.ledOffMS = 1000;notification.flags = Notification.FLAG_SHOW_LIGHTS;

当然,如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动,写法如下:

notification.defaults = Notification.DEFAULT_ALL;
0 0
原创粉丝点击