标签

Android 44

Android Network security configuration Android 网络配置 Android Camera Preview gradlew 源码分析 Android 动态修改菜单 Android RelativeLayout 之 Gravity 的使用 Android Studio Gradle Download Error Android加载子View 【转】Android打开与关闭软键盘 Android EditText软键盘显示隐藏以及“监听” Android mipmap文件夹 Android 用命令行更新SDK Android Service学习之AIDL, Parcelable和远程服务 Android 5.0设备中,Notification小图标是白色的 Android最佳实践 Android Keystore 文件的密码修改 Android Studio 中加载so库文件 Android 中方法重载遇到的问题 ListView & RecyclerView Google Volley如何缓存HTTP请求文件 Creating logs in Android applications Advanced Android TextView TextView高亮URL地址解析 TextView 高亮URL地址,并实现跳转 Best practices in Android development Android Sdk Manager无法更新问题解决办法 Android ViewPager滑动事件 Google Volley 网络请求框架(一) Andorid UI注入工具的使用(ButterKnife) Android 项目中出现的奇葩bug, 数据NullPointExcption Android Drawable Animation Android 图片的毛玻璃效果 Android之使用Log打印日志 使用Fidder来拦截Android发送的HTTP请求 Android之Webview使用 Android之Notification的使用(二) Android之Notification的使用(一) Android Keyboard Show&Hiden Android 粘贴板的使用 Android中使用.9.png 使用Fidder来拦截Android发送的HTTP请求 Andorid JUnit 单元测试 Activity之间的切换动画 Android ListView中Adapter的使用

Android之Notification的使用(一)

2014年10月11日

Android之Notification的使用(一)

在通知栏展示一些及时消息是一件非常常见的事情,相对来说,使用Notification也是一件很 简单的事情。

一个简单的事情,做起来也会遇到bug,先贴代码:

Intent intent = new Intent(this, OtherActivity.class);
String currentTime =  DateTimeUtil.formatDateDefault(Calendar.getInstance().getTime());
intent.putExtra("time", currentTime);
int notificationId = (int) System.currentTimeMillis();
PendingIntent pendingIntent= PendingIntent.getActivity(
    this, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle(currentTime)
        .setContentText("text")
        .setTicker("tricker")
        .setStyle(new NotificationCompat.BigTextStyle().bigText("big text"))
        .setAutoCancel(true)
        .setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = mBuilder.build();
notificationManager.notify(notificationId, notification);

就按照上述的样子,就可以展示出一条Notification到状态栏了。很easy.

可是问题来了,在做点击事件的时候,跳转出现了问题。

问题描述

因为没一个Notification的NotificationId都不一样,所以,每一次都会添加一个Notification到状态栏。 从上面的代码可以看出,所有的Notification的点击事件都指向了OtherActivity。 当状态栏上有多个Notification的时候并且我们退出了应用程序,这时候,点击其中一条Notification,会 启动OtherActivity, 问题来了,我在点击其它的Notification的时候,就没有任何响应。

解决办法

经过一番查找过后,还是没有找到解决办法。最后问了一下同事,解决方法简单的出乎我的意料。如下代码:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

只需要设置一下Flag就行了,如果你只需要启动一个Activity,可以在Mainfest.xml中添 加android:launchMode="singleTask"就行了。

贴上我的代码地址:下载地址NotificationDemo_01

注意事项

  • 当有多个Notification的时候,Notification的跳转事件被最新的一个Notification覆盖了。
    • 原因 问题主要出在PendingIntent.getActivity();的第二个参数,API文档里虽然说是未被使用的参数 (给出的例子也直接写0的),实际上是通过该参数来区别不同的Intent的,如果id相同,就会覆盖 掉之前的Intent了。所以总是获取到最后一个Intent。
    • 解决办法 PendingIntent.getActivity();的第二个参数传入不同的id
  • Notification 声音,震动,LED灯

     // 震动
     notification.vibrate = new long[] {100,400,100,400};
     // 要添加震动权限:<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
    
     // 声音
     notification.sound=Uri.parse("android.resource://"+R.class.getPackage().getName()+"/" +R.raw.ring);
    
     notification.ledARGB=Color.GREEN;//led灯颜色
     notification.ledOffMS=1000;//关闭时间 毫秒
     notification.ledOnMS=1000;//开启时间 毫秒
     notification.flags|=Notification.FLAG_SHOW_LIGHTS;
    

    ps: LED 显示只有在熄屏的时候才有效果, 一定要给震动加上权限

参考资料

  1. intent.setFlags方法中的参数值含义
  2. 同时显示多个Notification时PendingIntent的Intent被覆盖?


友情链接: Hiro's Blog | Junjun's Blog