Notification通知点击无效,无法跳转问题
来源:互联网 发布:三星公司 ge矩阵法 编辑:程序博客网 时间:2024/06/08 02:20
今天遇到一个很奇怪的问题,就是我们项目里的通知突然间失效了,具体表现是:通知栏能弹出通知提示,但是想通过它点击跳转到Activity确无法响应,也不消失,然后就抓耳挠腮的开始一点点debug调试找原因所在,始终无所收获。后来我又把项目里的有关通知的代码(一共也没有多少)单独写成一个demo,发现也还是不行。经历了各种百度,查资料,终无所或,后来找了个正常的demo,反复对比,一点点修改实验,终于被我找到了问题所在,下面我就开始讲述一下问题所在。
首先,先展示一下有问题的代码:
NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(mContext); builder.setContentTitle(title); builder.setContentText(content); Notification n = builder.getNotification(); if (PublicUtils.ISDEMO) { n.icon = R.drawable.icon_main; } else { n.icon = R.drawable.icon_main; } n.tickerText = title; if (awoketype == 2) {// isSound表示需要声音提示 n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音 } else if (awoketype == 1) {// 震动 n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限 long[] vibrate = {0, 100, 200, 300}; // 自定义震动 n.vibrate = vibrate; } else {//铃声加震动 n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音 n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限 long[] vibrate = {0, 100, 200, 300}; // 自定义震动 n.vibrate = vibrate; } // n.sound = Uri.parse("file:///sdcard/test.mp3");//调用自定义声音 n.defaults |= Notification.DEFAULT_LIGHTS; // 调用系统默认的灯光 n.flags |= Notification.FLAG_AUTO_CANCEL; // 通知被点击后自动消除 n.flags |= Notification.FLAG_NO_CLEAR; // 点击'Clear'时,不清除该通知 //n.flags |= Notification.FLAG_; //让声音、振动无限循环,直到用户响应 n.when = System.currentTimeMillis(); Intent intent = new Intent(mContext, RelayActivity.class); PendingIntent pi = PendingIntent.getActivity(mContext, id, intent, 0); builder.setContentIntent(pi); nm.notify(id, n);问题代码就是这样,具体表现是:通知栏能弹出通知提示,但是想通过它点击跳转到Activity确无法响应,也不消失。
这段代码要是一行一行的去看的话,是一点问题都没有,所以我用debug断点调试许久,发现也没出现问题。百思不得其解,后来就百度了一个正确的demo,然后发现写法都大同小异,为什么我的就有问题呢,细心的我开始一行一行去对比,一点一点去尝试,后来发现我的notification声明的位置跟demo有所不同,然后我就去调换它的位置,把他挪到builder.setContentIntent之后,然后重新运行,奇迹发生了,居然可以了,应该是notification是依附于builder构建的,由于一开始builder的不完整即notification声明位置不恰当导致,问题就这么被解决了。
另外还要说一点,这样的写法,下拉通知的图标会显示不出来,需要builder.setSmallIcon(R.mipmap.ic_launcher);这样去设置。
到这里所有的问题都解决了,只是因为以前我们的项目是没有问题的,所以我不明白问题是出在了哪里,我就去以前分支上找答案,我们的项目是最近从eclipse迁移到studio上的,所以我终于在一起eclipse 的分支上发现了点有用的东西,以前分支上的代码是这样的:
NotificationManager nm = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);Notification n = new Notification();if (PublicUtils.ISDEMO) {n.icon = R.drawable.icon_main;}else{n.icon = R.drawable.icon_main;}n.tickerText = title;if (awoketype == 2) {// isSound表示需要声音提示n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音} else if (awoketype == 1) {// 震动n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限long[] vibrate = { 0, 100, 200, 300 }; // 自定义震动n.vibrate = vibrate;}else{//铃声加震动n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限long[] vibrate = { 0, 100, 200, 300 }; // 自定义震动n.vibrate = vibrate;}// n.sound = Uri.parse("file:///sdcard/test.mp3");//调用自定义声音n.defaults |= Notification.DEFAULT_LIGHTS; // 调用系统默认的灯光n.flags |= Notification.FLAG_AUTO_CANCEL; // 通知被点击后自动消除n.flags |= Notification.FLAG_NO_CLEAR; // 点击'Clear'时,不清除该通知//n.flags |= Notification.FLAG_; //让声音、振动无限循环,直到用户响应n.when = System.currentTimeMillis();Intent intent = new Intent(mContext, RelayActivity.class);PendingIntent pi = PendingIntent.getActivity(mContext, id, intent, 0);n.setLatestEventInfo(mContext, title, content, pi);nm.notify(id, n);
发现以前的代码顺讯确实是这样,但是有一句话确不同,n.setLatesteEventInfo,我就又去百度这个方法,发现在最新的sdk23上,此方法已失效,原来谷歌废弃了它,所以才用Notification.builder来构建,结果应该是项目迁移的时候,小伙伴直接用Notification.builder进行了替换,而导致这个功能失效,坑了宝宝(/捂脸哭)。
在此写出来,希望大家都长些教训吧,同时也学习了新知识,意外的收获。
最后贴一下正确的代码:
NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(mContext); builder.setContentTitle(title); builder.setContentText(content); Intent intent = new Intent(mContext, RelayActivity.class); PendingIntent pi = PendingIntent.getActivity(mContext, id, intent, 0); builder.setContentIntent(pi); builder.setSmallIcon(R.drawable.icon_main); Notification n = builder.getNotification(); if (PublicUtils.ISDEMO) { n.icon = R.drawable.icon_main; } else { n.icon = R.drawable.icon_main; } n.tickerText = title; if (awoketype == 2) {// isSound表示需要声音提示 n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音 } else if (awoketype == 1) {// 震动 n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限 long[] vibrate = {0, 100, 200, 300}; // 自定义震动 n.vibrate = vibrate; } else {//铃声加震动 n.defaults |= Notification.DEFAULT_SOUND;// 调用默认声音 n.defaults |= Notification.DEFAULT_VIBRATE; // 调用系统默认震动,需要权限 long[] vibrate = {0, 100, 200, 300}; // 自定义震动 n.vibrate = vibrate; } // n.sound = Uri.parse("file:///sdcard/test.mp3");//调用自定义声音 n.defaults |= Notification.DEFAULT_LIGHTS; // 调用系统默认的灯光 n.flags |= Notification.FLAG_AUTO_CANCEL; // 通知被点击后自动消除 n.flags |= Notification.FLAG_NO_CLEAR; // 点击'Clear'时,不清除该通知 //n.flags |= Notification.FLAG_; //让声音、振动无限循环,直到用户响应 n.when = System.currentTimeMillis(); nm.notify(id, n);
- Notification通知点击无效,无法跳转问题
- Android 通知栏Notification点击跳转无效
- Notification通知,点击通知后跳转
- 通知的点击跳转(Notification)
- Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)
- 状态栏Notification | 点击通知后跳转(未写) | 自定义Notification布局(未写) | 封装
- Notification(Notification的通知栏常驻、各种样式、点击无效、禁止滑动删除、兼容低版本)
- Notification(Notification的通知栏常驻、各种样式、点击无效、禁止滑动删除、兼容低版本)
- Android 弹无虚发之第四弹:你应该掌握的Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)
- Android 弹无虚发之第四弹:你应该掌握的Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)
- Android 弹无虚发之第四弹:你应该掌握的Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)
- Android 弹无虚发之第四弹:你应该掌握的Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)
- android 使用Notification弹多个通知时,点击跳转intent取值时总是最后一个
- android-Notification点击跳转Activity
- Notification点击跳转及消失
- 关于百度推送点击通知,跳转的问题(Android)
- 关于百度云推送点击通知的跳转问题
- android小问题: Notification通知栏 中用Intent传值无效
- maven 启动项目 Document base Maven Webapp does not exist or is not a readable directory
- 快速的判断一个数的二进制中有多少个1,快速判断x是不是2^n
- iOS NSDictionary,JSON和XML互相转换
- 关于MIPI转RGB/LVDS(ICN6211/ICN6202)芯片的使用技巧
- java4种线程池的使用
- Notification通知点击无效,无法跳转问题
- 用CSS对DIV画三角形
- C++primer 第十四章笔记 初稿
- JAVA反射机制学习(二)
- codeforces 338D GCD Table
- LIN总线技术及应用——协议规范(一)
- ubuntu16.04下安装TensorFlow(GPU加速)----详细图文教程
- 《爱迪生传》
- hadoop完全分布式搭建的总结