MyException - 我的异常网
当前位置:我的异常网» 移动开发 » Notification的施用

Notification的施用

www.MyException.Cn  网友分享于:2013-07-02  浏览:9次
Notification的使用
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的代码如下:
1
Intent intent = new Intent(this, A.class);
2
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
view sourceprint?
1
Intent intent = new Intent(Intent.ACTION_MAIN);
2
intent.addCategory(Intent.CATEGORY_LAUNCHER);
3
intent.setClass(this, Main.class);
4
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类。

文章评论

那些争议最大的编程观点
那些争议最大的编程观点
老程序员的下场
老程序员的下场
程序员都该阅读的书
程序员都该阅读的书
每天工作4小时的程序员
每天工作4小时的程序员
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我的丈夫是个程序员
我的丈夫是个程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员必看的十大电影
程序员必看的十大电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
代码女神横空出世
代码女神横空出世
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
 程序员的样子
程序员的样子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
中美印日四国程序员比较
中美印日四国程序员比较
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我是如何打败拖延症的
我是如何打败拖延症的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员应该关注的一些事儿
程序员应该关注的一些事儿
编程语言是女人
编程语言是女人
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
一个程序员的时间管理
一个程序员的时间管理
鲜为人知的编程真相
鲜为人知的编程真相
旅行,写作,编程
旅行,写作,编程
如何成为一名黑客
如何成为一名黑客
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
总结2014中国互联网十大段子
总结2014中国互联网十大段子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有