android 学习笔记 通知的使用
来源:互联网 发布:esp8266与51单片机 编辑:程序博客网 时间:2024/05/04 19:07
1 通知的基本用法
通知的用法还是比较灵活的,既可以在活动里创建,也可以在广播接收器里创建,服务里创建。相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。
不过,无论是在哪里创建通知,整体的步骤都是相同的,下面我们就来学习一下创建通 知的详细步骤。首先需要一个NotificationManager来对通知进行管理,可以调用Context的 getSystemService()方法获取到。getSystemService()方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入 Context.NOTIFICATION_SERVICE 即可。因此,获取代码 如下
NotificationManager <span style="font-family: Arial, Helvetica, sans-serif;">notificationManager </span>= (NotificationManager) appContext.getSystemService(Context.NOTIFICATION_SERVICE);
接下来需要创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们可以使用它的有参构造函数来进行创建。Notification 的有参构造函数接收三个参数,第一个参数用于指定通知的图标,比如项目的res/drawable 目录下有一张icon.png图片,那么这里就可以传入R.drawable.icon。第二个参数用于指定通知的ticker 内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。第三个参数用于指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。因此,创建一个Notification对象就可以写成:
Notification mNotification= new Notification(R.drawable.icon,"This is ticker text",System.currentTimeMillis());创建好了Notification对象后,我们还需要对通知的布局进行设定,这里只需要调用 Notification 的setLatestEventInfo()方法就可以给通知设置一个标准的布局。这个方法接收四个参数,第一个参数是Context,这个没什么好解释的。第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定通知的正文内容,同样下 拉系统状态栏就可以看到这部分内容。第四个参数我们暂时还用不到,可以先传入null。因此,对通知的布局进行设定就可以写成:
mNotification.setLatestEventInfo(context, "This is content title", "This is content text", null);
以上工作都完成之后,只需要调用NotificationManager 的notify()方法就可以让通知显示出来了。notify()方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id都是
不同的。第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以写成:
notificationManager.notify(1,mNotification);
这个样设置了 , 通知是有了 , 但是点击通知时无相应,所以要增加一个PendingIntent。
PendingIntent从名字上看起来就和Intent有些类似,它们之间也确实存在着不少共同点。比如它们都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。不同的是,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这四种值可选,每种值的含义你可以查看文档。
代码如下所示
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);取消通知。代码如下所示
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(1);
在创建通知的时候给每条通知指定的id。当时我们给这条通知设置的id就是 1。因此,如果你想要取消哪一条通知,就在cancel()方法中传入该通知的id就行了。
2 通知的高级技巧
现在你已经掌握了创建和取消通知的方法,并且知道了如何去响应通知的点击事件。不过通知的用法并不仅仅是这些呢,那么本节中我们就来探究一下通知更多的高级技巧。 观察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;要用到震动 需要添加以下权限
<uses-permission android:name="android.permission.VIBRATE" />
现在的手机基本上都会前置一个LED灯,当有未接电话或未读短信,而此时手机又处于锁屏状态时,LED灯就会不停地闪烁,提醒用户去查看。我们可以使用ledARGB、ledOnMS、ledOffMS 以及flags这几个属性来实现这种效果。ledARGB用于控制LED灯的颜色,一般有红绿蓝三种颜色可选。ledOnMS用于指定LED灯亮起的时长,以毫秒为单位。ledOffMS 用于指定LED灯暗去的时长,也是以毫秒为单位。flags可用于指定通知的一些行为,其中就包括显示LED灯这一选项。所以,当通知到来时,如果想要实现LED灯以绿色的灯光一闪一闪的效果,就可以写成:
notification.ledARGB = Color.GREEN; notification.ledOnMS = 1000; notification.ledOffMS = 1000; notification.flags = Notification.FLAG_SHOW_LIGHTS;当然,如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动,写法如下:
notification.defaults = Notification.DEFAULT_ALL;
这个是一个项目中的通知使用
protected void sendNotification() { // create and send notificaiton 创建并且发送通知 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( appContext) .setSmallIcon(appContext.getApplicationInfo().icon) .setWhen(System.currentTimeMillis()).setAutoCancel(true); // 管理应用程序包 PackageManager packageManager = appContext.getPackageManager(); // 当前app名称 String appname = (String) packageManager .getApplicationLabel(appContext.getApplicationInfo()); Log.d(TAG + "app名称", appname); // notification titile 通知的标题 String contentTitle = appname; String statusBarText = notifyText; // 点击通知标题要启动的APP Intent msgIntent = packageManager.getLaunchIntentForPackage(packageName); // 即将发生的intent PendingIntent pendingIntent = PendingIntent.getActivity(appContext, notifyID, msgIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentTitle(contentTitle); mBuilder.setContentText(summaryBody); mBuilder.setContentIntent(pendingIntent); // mBuilder.setNumber(notificationNum); Notification notification = mBuilder.build(); if (isForeground) { notificationManager.notify(foregroundNotifyID, notification); notificationManager.cancel(foregroundNotifyID); } else { //只有 三星 小米 , 索尼能显示应用图标未读数 BadgeUtil.setBadgeCount(appContext, notificationNum,notification); notificationManager.notify(notifyID, notification); } } catch (Exception e) { e.printStackTrace(); } } /** * 手机震动和声音提示 */ public void viberateAndPlayTone() { try { lastNotifiyTime = System.currentTimeMillis(); // 判断是否处于静音模式 if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) { EMLog.e(TAG, "in slient mode now"); return; } if (model.getSettingMsgVibrate()) { long[] pattern = new long[] { 0, 180, 80, 120 }; vibrator.vibrate(pattern, -1); } if (model.getSettingMsgSound()) { if (ringtone == null) { Uri notificationUri = RingtoneManager .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); ringtone = RingtoneManager.getRingtone(appContext, notificationUri); if (ringtone == null) { EMLog.d(TAG, "cant find ringtone at:" + notificationUri.getPath()); return; } } if (!ringtone.isPlaying()) { String vendor = Build.MANUFACTURER; ringtone.play(); // for samsung S3, we meet a bug that the phone will // continue ringtone without stop // so add below special handler to stop it after 3s if // needed if (vendor != null && vendor.toLowerCase().contains("samsung")) { Thread ctlThread = new Thread() { public void run() { try { Thread.sleep(3000); if (ringtone.isPlaying()) { ringtone.stop(); } } catch (Exception e) { } } }; ctlThread.run(); } } } } catch (Exception e) { e.printStackTrace(); } }
- android 学习笔记 通知的使用
- Android学习-通知的使用详解
- Android学习笔记4-通知
- <android 笔记>通知栏学习
- Android学习笔记 通知Notification
- android通知的使用
- Android 通知的使用
- android通知栏通知的开发笔记
- 【Android】安卓学习笔记之通知的基本用法
- 【Android】安卓学习笔记之通知的高级技巧
- 安卓学习笔记之通知栏的使用
- [oc学习笔记]通知中心传值的使用
- android学习十三(android的通知使用)
- Android笔记(二十八)通知的使用
- Android学习笔记,Notification通知事件
- <android 笔记>通知栏学习2
- Android学习笔记(32):通知推送Notification
- Android Service学习笔记--用户通知
- jxl(Java Excel API) 使用方法 【2】
- 常规功能和模块自定义系统(cfcmms)—003概述
- Thread之Exchanger
- 一、A*搜索算法
- 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
- android 学习笔记 通知的使用
- ubuntu下安装deb文件
- UrlConnection 请求乱码的解决办法
- OCTEN vs intel DPDK
- 日经社説 20150826 企業自身で生産性高める働き方改革を
- 前端工程师需要掌握的技能
- 只有站的高才能看的远
- 如何根据当前时间生成唯一编号
- Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)