在写完 “ androidNotification 的使用 ”的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例。当然重点便是如何设置该Activity 的 launchMode 与 Intent 的 Flags 了,说到这里,我不得不说一下今晚的调试经历,当然这里所说的所有的Notification都设置了FLAG_ONGOING_EVENT。

  按照 “(转载)Android下Affinities和Task”一文所说的,我们不难得出这样的结论:

  1、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK ,而launchMode保持不变(即默认为:standard),则当用户用手点击Notification时,此时匹配到后台的Task,并把在堆栈中对应要启动的Activity之前的所有Activity全部清除掉,并且由于 standard 默认对于新的Intent总是创建新的Activity对象。因此存在于该Task中旧的Activity也会被清除掉,然后在该Task中创建新的Activity对象。

  2、设置当用户触发Notification时所发出的Intent,如果设置 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK,而launchMode设置为singleTop,则当用户用手点击Notification时,同1一样,只是存在于该Task中旧的Activity不会被清除掉,此时Intent传递给已经存在的Activity并不会创建新的Activity。

  上面得出的结论,经过返回测试,1是正确的,2却存在着很莫名奇妙的问题

  假设现在有个程序X,有2个Activity,分别是 A , B ,其中 A 是 设置了android.intent.action.MAIN的Activity(入口Activity),两者的launchMode都为默认的standard,创建该Intent的代码如下:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

很明显我们设置的是当用户点击 Notification 时,应该出现的是 A Activity,但无论如何按home键退出当前Task,并使之成为后台Task,在从程序列表启动该程序总能恢复到Task顶端的Activity给用户,如 当前 B,按home键,在从程序列表启动 X ,这个时候出现的Activity任然是 B,但按照如下的方法操作却会使得从程序列表启动 X,出现的是新创建的A Activity,其中经过Log打印得知下面的所有Activity都在同一个Task中

  1、打开程序出现A,从A startActivity 到B,按Home键,点Notification出现A,再从A startActivity 到 B,按Home键,从程序列表打开程序 出现新创建的实例A

  2、打开程序出现A,从A startActivity 到B,点Notification出现A,再从A startActivity 到B,按Home键,从程序列表打开程序也出现了新创建的实例A

  这里所说的“新创建的实例A”都是创建在同一Task中的新的A Activity实例,也就是说按照以上两种方法,再按返回键,出现的则是 B,再按返回键出现的则是 A。这里我实在想不出为什么会在同一Task中创建一个新的Activity,就算从程序列表打开程序的Intent使用了FLAG_ACTIVITY_NEW_TASK标记,我也不知道为什么,如果有朋友知道,一定要告诉我。

  到这里,我开始发现 从程序列表启动 的优越性,因为不管是在什么时候按Home,再次从程序列表启动时,总能返回到Task的栈顶Activity。起初我想过一个办法,便是重载Activity写一个类实现当onResume的时候更新Notification,然后我的所有Activity类都直接从该类继承,使得当按Home 之后总能让Notification记住Task的栈顶Activity,就像QQ一样,但这种方法当然有点牵强,于是我开始看SDK 中 有关Home的Simple,终于发现了如果使用如下的Intent,便不会调用对应的Activity,而是调用Task中的栈顶Activity

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, Main.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

除了 setClass 可以换成使用setClassName 绑定,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED可以不设,其他的选项都缺一不可。设置ACTION_MAIN与CATEGORY_LAUNCHER是把该Intent发给了系统对应创建程序的模块,然后系统该模块根据设定的包与类信息还有flags进行处理。当然所有的Intent工作原理都是这样,只是对 ACTION_MAIN - CATEGORY_LAUNCHAR 的处理较为特殊,使得总是显示Task栈顶的Activity而不是setClass设定的Activity类。

转自:点击打开链接

如何设置 Notification 中PendingIntent 的 Intent相关推荐

  1. [问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?

    情况是这样的,使用NotificationManager触发多个Notification: Java代码   private Notification genreNotification(Contex ...

  2. Android开发--Notification和PendingIntent

    手机上方的状态栏用于显示通知消息,实现的方法很简单,只需要记住五个步骤即可(步骤写在源代码中的注释中).pendingIntent意思是延期执行的Intent,一般用于Notification中,下面 ...

  3. Android中pendingIntent的深入理解

    pendingIntent字面意义:等待的,未决定的Intent. 要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, ...

  4. PendingIntent与Intent区别

    intent英文意思是意图,pending表示即将发生或来临的事情. PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转. Int ...

  5. [转]Android中pendingIntent的深入理解

    转自;here pendingIntent字面意义:等待的,未决定的Intent. 要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, ...

  6. Notification的使用以及Intent打开各种文件

    一:Notification的使用 详细链接http://blog.csdn.net/vipzjyno1/article/details/25248021 使用步骤: 流程模块: 第一步: 创建一个通 ...

  7. 设置div中的div居中显示

    设置div中的div居中显示 方法一. <div class='big'><div class='small'>box1</div></div>styl ...

  8. iOS开发UIlabel篇:iOS 10 3 Label设置的中划线突然失效了

    iOS10.3更新后,商城APP这样的UI:原价 "¥500 " 类似Label设置的中划线突然失效了. 这可能是苹果系统的一个bug. 根本原因:Label上的文字只要包含有&q ...

  9. python代码怎么设置,如何设置PyCharm中的Python代码模版(推荐)

    在MacOs运行的PyCharm中,执行python文件,如果不指定python文件字符编码会报错: SyntaxError: Non-ASCII character "xe6" ...

最新文章

  1. 万字长文带你了解推荐系统全貌!
  2. CROC-MBTU 2012, Elimination Round (ACM-ICPC) 总结
  3. 1.1 - C#语言习惯 - 使用属性而不是可访问的数据成员
  4. 数据结构和算法-链表
  5. RequestBody获取前端数据_360视频云Web前端HEVC播放器实践剖析
  6. 95-080-048-源码-启动-启动standalonesession
  7. C语言和C++中Struct区别
  8. 你们信不信,everyting找不全文件
  9. python身份证验证系统_用python制作全国身份证号验证及查询系统
  10. iapp进度条倒计时_倒计时进度条app
  11. 解决mysql登录出现10061的问题
  12. Network Switching Software Platform Guide学习笔记
  13. datedif函数mysql_DateDiff函数
  14. CentOS系统下文件夹目录结构及其作用
  15. ROS 入门基础(四)自定义话题, publisher和Subscriber
  16. 使用工具Android Studio实现一个简单的Android版的新闻APP
  17. Android_studio 开发简单登陆界面
  18. 安全TEE下的GIC-400(一)
  19. C++ 10 翁恺> 继承
  20. php网站 类设计,PHP网站开发与设计

热门文章

  1. Rancher如何按计算资源调度
  2. FJ省队集训DAY2 T2
  3. hadoop 基础命令
  4. 学习:配置hibernate
  5. 因讨要介绍费引发纠纷 浙江龙湾一男子砍死房产中介
  6. SQL数据库连接语句
  7. 《UVM实战》——3.1节UVM的树形结构
  8. docker-compose的一些理解
  9. easy-excel导入导出excel(待完善)
  10. Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享