Notification可以让我们在获得消息的时候,在状态栏,锁屏界面来显示相应的信息,很难想象如果没有Notification,那我们的qq和微信以及其他应用没法主动通知我们,我们就需要时时的看手机来检查是否有新的信息和提醒着实让人烦心,也体现出Notification重要性。这里会介绍三种Notification,分别是普通的Notification,折叠式Notification和悬挂式Notification。

1. 普通Notification

首先创建Builder 对象,用PendingIntent 控制跳转,这里跳转到网页

  1. Notification.Builder builder = new Notification.Builder(this);
  2. Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/"));
  3. PendingIntent pendingIntent = PendingIntent.getActivity(this, , mIntent, );

有了builder 我们就可以给Notification添加各种属性:

  1. builder.setContentIntent(pendingIntent);
  2. builder.setSmallIcon(R.drawable.lanucher);
  3. builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
  4. builder.setAutoCancel(true);
  5. builder.setContentTitle("普通通知");

最后是创建NotificationManager调用notify方法:

  1. notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  2. notificationManager.notify(, builder.build());

来看看效果:

2. 折叠式Notification

折叠式Notification是一种自定义视图的Notification,用来显示长文本和一些自定义的布局的场景。它有两种状态,一种是普通状态下的视图(如果不是自定义的话和上面普通通知的视图样式一样),一种是展开状态下的视图。和普通Notification不同的是,我们需要自定义的视图,而这个视图显示的进程和我们创建视图的进程不再一个进程,所以我们需要使用RemoteViews,首先要使用RemoteViews来创建我们的自定义视图:

  1. //用RemoteViews来创建自定义Notification视图
  2. RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_fold);

视图的布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="100dp"
  5. android:background="@drawable/fold"
  6. android:orientation="horizontal">
  7. <ImageView
  8. android:id="@+id/iv_image"
  9. android:layout_width="100dp"
  10. android:layout_height="100dp"
  11. android:src="@drawable/fold"
  12. />
  13. <TextView
  14. android:id="@+id/tv_text"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_marginTop="30dp"
  18. android:layout_marginLeft="150dp"
  19. android:text="展开后的自定义视图"
  20. android:textColor="@color/colorPrimaryDark"/>
  21. </LinearLayout>

我们需要把自定义的视图赋值给Notification的视图,下面代码是把自定义视图赋值给Notification展开时的视图

  1. //指定展开时的视图
  2. notification.bigContentView = remoteViews;

当然我们也可以把自定义视图赋值给Notification普通状态时的视图

  1. //指定普通状态时的视图
  2. notification.contentView = remoteViews;

其他的代码和普通Notification没什么区别,折叠式Notification完整代码:

  1. Notification.Builder builder = new Notification.Builder(this);
  2. Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/"));
  3. PendingIntent pendingIntent = PendingIntent.getActivity(this, , mIntent, );
  4. builder.setContentIntent(pendingIntent);
  5. builder.setSmallIcon(R.drawable.foldleft);
  6. builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
  7. builder.setAutoCancel(true);
  8. builder.setContentTitle("折叠式通知");
  9. //用RemoteViews来创建自定义Notification视图
  10. RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_fold);
  11. Notification notification = builder.build();
  12. //指定展开时的视图
  13. notification.bigContentView = remoteViews;
  14. notificationManager.notify(, notification);

如果不是自定义普通状态视图的话,折叠式Notification普通状态下和普通Notification没什么区别

我们接着往下拉,使折叠式Notification完全展开就会出现我们自定义的视图

3. 悬挂式Notification

悬挂式Notification是android5.0新增加的方式,和前两种显示方式不同的是,前两种需要下拉通知栏才能看到通知,而 悬挂式Notification不需要下拉通知栏就直接显示出来悬挂在屏幕上方并且焦点不变仍在用户操作的界面因此不会打断用户的操作,过几秒就会自动消失。
和前两种Notification不同的是,他需要调用setFullScreenIntent来将Notification变为悬挂式Notification

  1. //如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
  2. PendingIntent hangPendingIntent = PendingIntent.getActivity(this, , hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
  3. builder.setFullScreenIntent(hangPendingIntent, true);

实现悬挂式Notification完整代码:

  1. Notification.Builder builder = new Notification.Builder(this);
  2. Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/"));
  3. PendingIntent pendingIntent = PendingIntent.getActivity(this, , mIntent, );
  4. builder.setContentIntent(pendingIntent);
  5. builder.setSmallIcon(R.drawable.foldleft);
  6. builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
  7. builder.setAutoCancel(true);
  8. builder.setContentTitle("悬挂式通知");
  9. //设置点击跳转
  10. Intent hangIntent = new Intent();
  11. hangIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  12. hangIntent.setClass(this, MyNotificationActivity.class);
  13. //如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
  14. PendingIntent hangPendingIntent = PendingIntent.getActivity(this, , hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
  15. builder.setFullScreenIntent(hangPendingIntent, true);
  16. notificationManager.notify(, builder.build());

来看看效果

4. Notification的显示等级

android5.0加入了一种新的模式Notification的显示等级,共有三种:

  • VISIBILITY_PUBLIC 任何情况都会显示通知
  • VISIBILITY_PRIVATE 只有在没有锁屏时会显示通知
  • VISIBILITY_SECRET 在pin、password等安全锁和没有锁屏的情况下才能够显示

设置非常简单只要调用setVisibility方法就可以了

  1. builder.setVisibility(Notification.VISIBILITY_PUBLIC);

我在这里写了个方法来设置Notification等级,用radioGroup来演示Notification的各个显示等级,详情请参照源码。

  1. private void selectNotofovatiomLevel(Notification.Builder builder) {
  2. switch (radioGroup.getCheckedRadioButtonId()) {
  3. case R.id.rb_public:
  4. builder.setVisibility(Notification.VISIBILITY_PUBLIC);
  5. builder.setContentText("public");
  6. break;
  7. case R.id.rb_private:
  8. builder.setVisibility(Notification.VISIBILITY_PRIVATE);
  9. builder.setContentText("private");
  10. break;
  11. case R.id.rb_secret:
  12. builder.setVisibility(Notification.VISIBILITY_SECRET);
  13. builder.setContentText("secret");
  14. break;
  15. default:
  16. builder.setVisibility(Notification.VISIBILITY_PUBLIC);
  17. builder.setContentText("public");
  18. break;
  19.  
  20. }
  21. }

源码下载

Android5.x Notification应用解析的更多相关文章

  1. i.mx6 Android5.1.1 build解析

    参考资料:理解 Android Build 系统 把总结放前面: 1. 常用编译命令 make clean 执行清理,等同于:rm -rf out/. make sdk 编译出 Android 的 S ...

  2. Android Bug 记录

    1.Unable to resolve target 'android-5' 无法解析目标 ' 安卓系统-5'      Unable to resolve target 'Google Inc.:G ...

  3. Activity组件安全(下)

    什么是Activity劫持 简单的说就是APP正常的Activity界面被恶意攻击者替换上仿冒的恶意Activity界面进行攻击和非法用途.界面劫持攻击通常难被识别出来,其造成的后果不仅会给用户带来严 ...

  4. Android Design Support Library(三)用CoordinatorLayout实现Toolbar隐藏和折叠

    此文的代码在Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果代码的基础上进行修改,如果你没有看过本系列的第一篇文章最好先看一看.Co ...

  5. Android源码博客目录

    每次都找不到,干脆每个部分都开个目录,方便找 0. 杂项 一些Android的博客,没事翻翻 1. 构建相关 linux和Android的Makefile和android.mk android 目录下 ...

  6. Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果

    这里我们用TabLayout来实现这一效果.TabLayout是Android Design Support Library库中的控件.Google在2015的IO大会上,给我们带来了更加详细的Mat ...

  7. i.mx6 Android5.1.1 初始化流程之init.rc解析(未完成)

    接上一篇:i.mx6 Android5.1.1 初始化流程之init进程 参考资料:http://blog.csdn.net/mr_raptor/article/category/799879 这个博 ...

  8. PureMVC(JS版)源码解析(二):Notification类

    上篇博客,我们已经就PureMVC的设计模式进行的分析,这篇博文主要分析Notification(消息)类的实现. 通过Notification的构造函数可以看出,PureMVC中的Notificat ...

  9. 【直接拿来用のandroid公共代码模块解析与分享】の Notification和NotificationManager

    本文源代码托管在https://github.com/ASCE1885/asce-common,欢迎fork Android项目做得多了.会发现原来非常多基础的东西都是能够复用,这个系列介绍一些自己项 ...

随机推荐

  1. Storm的acker确认机制

    Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...

  2. linux下利用dd命令测试磁盘读写速度

    在Linux中,dd命令用于读取.转换和输出数据,它可从标准输入或文件中读取数据并输出到指定文件或标准输出中.该命令使用参数如下: 其中”=“后面的为设置的参数 If = <文件名>  : ...

  3. Installation failed with message...It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.

    错误弹窗如图: Installation failed with message Failed to finalize session: INSTALL_FAILED_TEST_ONLY:instal ...

  4. [Java初探07]__关于面向对象的简单认识

    前言 类和对象,在我们学习Java语言的过程中,它们无时无刻不存在着,在我们还远未详细弄明白它们的意义之前,在我们不知不觉的下意识里,我们都会直接或间接的用到它们,这是因为Java是一门面向对象的语言 ...

  5. [Python 从入门到放弃] 5. 文件与异常(一)

    1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...

  6. 目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN

    看到一篇循序渐进讲R-CNN.Fast R-CNN.Faster R-CNN演进的博文,写得非常好,摘入于此,方便查找和阅读. object detection,就是在给定的图片中精确找到物体所在位置 ...

  7. MVC源码分析 - View

    感觉好久没有学习了, 汗. 年就这么过完了, 感觉没有尝到过年的味道. 现在的年过的有些冷清了. 除了体重证明着我过了一个年, 还有一件值得开心的事情, 终于把女朋友变成未婚妻了. 这是一大进步吧. ...

  8. WPF装饰器

    装饰器定义: 装饰器是一种特殊类型的 FrameworkElement,用于向用户提供可视化提示. 对于其他用户,装饰器可用于将功能控点添加到元素中或提供有关控件的状态信息. 装饰器可以在不改变原有的 ...

  9. Hibernate进行对象的增删改查

    首先我们看看hibernate手动配置步骤 (这个了解一点就可以了,以后是不会自己全部手动配置的) 1.    创建WEB项目 2       下载hibernate-release-4.3.11.F ...

  10. layer插件学习——弹框(自定义页)

    本文是自己整理的关于layer插件的弹框样式结果 介绍: 官方介绍:layer至今仍作为layui的代表作,受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自 ...