Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例

Android实现程序前后台切换效果 本文演示如何在Android中实现程序前后台切换效果。   在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。   我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是定义在别一个应用程序里的,比如说,想要给用户展示一个地图的信息,现在已经有一个Activity可以做这件事情,那么现在你的Activity需要做的就是 阅读详情

注意:本文大部分内容转载自:newcj 的博客 请尊重他人劳动成果!

今天在写完 “ android Notification 的使用 ”的时候,发现有几个问题,特别是设置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

    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);  
    Notification notification = new Notification(R.drawable.logo_icon_16,"移动营销", System.currentTimeMillis());  
    Intent intent = new Intent(Intent.ACTION_MAIN);   
    intent.addCategory(Intent.CATEGORY_LAUNCHER);   
    intent.setClass(this, BeforeLogoActivity.class);   
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
    notification.flags = Notification.FLAG_ONGOING_EVENT; // 设置常驻 Flag  
    PendingIntent contextIntent = PendingIntent.getActivity(this, 0, intent, 0);  
    notification.setLatestEventInfo(getApplicationContext(),"移动营销", "", contextIntent);  
    notificationManager.notify(R.drawable.logo_icon_16, notification);  

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

搞了几天。。。还亏高人指点。。。哈哈!


来源:http://blog.youkuaiyun.com/zz_mm/article/details/8021428




彻底解决0x80070005错误代码:全面分析与实战指南 0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。 阅读详情

相关推荐

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 687

Android程序 类QQ通知常驻在Notification栏 点击Notification正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例...

注意:本文大部分内容转载自:newcj 的博客 请尊重他人劳动成果! 今天在写完 “ androidNotification 的使用”的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例。当然重点便是如何设置该Activity 的 launchMod...

移动开发记录 276

实战篇【2】-H3C防火墙开局基础配置

本篇文章为“H3C防火墙开局基础配置”,主要涵盖配置管理地址、聚合端口、安全区域、安全策略、静态路由、ACL,WEB和SSH远程管理、Console、SNMP、NTP时钟、日志主机等内容,对比交换机配置开局,增加两处配置,安全区域和安全策略。方便调试人员远程管理、调试。

weixin_47402139的博客 1万+

Android 各平台推送通知栏点击处理方案

/push 通知,点击回调处理。早期融云版本是通过 PushMessageReceiver 的方式进行回调,由于系统限制及延时问题,改为 RongBridgeActivity 进行中转回调处理。//透传通知时,调用。通知显示之前的回调,用户可拦截此事件进行通知自定义显示。融云默认推送、华为数据透传方式推送(华为)(不能保证到达率,已不建议使用)、 FCM 数据方式推送会回调此方法。//通知消息到达并显示之后的回调,之前魅族、小米会进行该回调,新版本ROM已经不支持了。

融云即时通讯 609

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 286

Tushare Pro的安装使用——“抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108”问题

最近做毕设关于量化交易的, 因此一直使用tushare作数据源,但是过程中到一些问题,因此这里写篇文章,供大家一起交流下。 Tushare简介 Tushare是一个免费、开源的python财经数据接口包。拥有如股票、基金、期货等行情数据,公司财务、基金经理等基本面数据,以及债券、外汇、行业、大数据、区块链。Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,因此非常方便...

sinat_40875078的博客 1万+

android通知栏响应事件

BroadcastReceiver onClickReceiver = new BroadcastReceiver() {               @Override             public void onReceive(Context context, Intent intent) {                 if (intent.getActi

i_lovefish的专栏 6889

【开发必备插件】iframe嵌套报“拒绝连接请求”的本地解决方法

关键词:iframe 拒绝连接、X-Frame-Options、Chrome 插件、前端调试、Allow X-Frame-Options前几天我在本地项目里调试一个第三方网站的嵌入页面时,遇到了一个非常经典的报错:xxx.com 拒绝了我们的连接请求。熟悉的老前端们一眼就知道——这是。但对于日常开发来说,我们经常需要在本地测试 iframe 嵌套外部页面(比如嵌第三方登录页、支付页、可视化报表系统等)。而线上站点配置了或DENY时,就会直接导致 iframe 加载失败。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1542

Notification返回到当前正在运行的Activity

android Notification notification=... NotificationManager nm=... // Intent notificationIntent = new Intent(this,this.getClass());  PendingIntent contentIntent = PendingIntent.getActivity(this, 0,

hrdfcdecfdeferde的专栏 413

【系统分析师】核心考点:100个高频知识点汇总

本文系统梳理了系统分析师考试的11大领域高频考点,重点解析了计算机硬件与体系结构的7个核心知识点:计算机五大部件(CPU/存储器/总线等)、校验码类型(奇偶/海明/CRC)、CISC与RISC指令系统对比、总线分类与特性、RAID磁盘阵列级别、流水线技术原理及Flynn系统分类法。内容涵盖硬件组成、数据校验、指令架构、存储技术等关键概念,通过表格对比和公式说明,为考生提供结构化的知识框架与备考重点。

数据知道的博客 5569

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程

JACKAL 1万+

实现简单的Notification,点击之后跳转到应用界面

NotificationService类 public class NotificationService extends Service { private Notification notification; private PendingIntent pit; private NotificationManager notificationManager; ...

hrxjjj的博客 1896

软件需求规格说明书(SRS)标准模板

《软件需求规格说明书(SRS)框架解析》摘要: 本文档系统阐述了SRS的标准结构,包含7大核心部分:1)引言(目的、背景和术语);2)总体描述(产品定位与用户特征);3)功能需求(模块化功能说明);4)非功能需求(性能、安全等指标);5)接口需求(用户/硬件/软件接口);6)其他技术要求;7)附录(图表与参考资料)。重点突出了功能需求模块的标准化描述模板(FR-01),以及安全需求中的HTTPS通信、SHA-256加密等关键指标。该框架为软件开发提供了明确的需求基准,涵盖从业务背景到技术实现的完整链条,是确

moton2017的博客 2890

Android 通过消息栏实现应用程序前后台切换效果Notification

在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。     我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是定义在别一个应用程序里的,比如说,想要给用户展示一个地图的信息,现在已经有一个Activity可以做这件事情,那么现在你的Activity需要做的就是将请求信息放进一个Intent对象里,并且将这个Inten

xfyunyun的专栏 1878

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android 实现微信,QQ的程序前后台切换:back键切换后台;点击通知栏恢复前台。

实现类似QQ的前后台切换:back键切换后台;点击通知栏恢复前台。

Just a Benginner 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android开发之让Android点击通知栏信息后返回正在运行的程序

在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity,   结果总是存在好几个同样的activity,就算要返回的activity正在前台,点击消息后也会重新打开一个一样的activity,返回好几次才能退出,   而不能像qq之类的点击通知栏消息回到之前存在的activity,如果存在就不再新建一个activity   说的有点绕,如果是遇到此类问题的肯定能

birthmarkqiqi的专栏 4275

Android实现程序前后台切换效果(类似QQ后台运行)

文章出处:http://www.cnblogs.com/hanyonglu/archive/2012/04/15/2450551.html 本文演示如何在Android中实现程序前后台切换效果。 在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。 我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是

zhou699的专栏 2999

点击Notification跳转到正在运行的activity

文章出自http://blog.youkuaiyun.com/zz_mm/article/details/8021428 注意:本文大部分内容转载自:newcj 的博客 请尊重他人劳动成果! 今天在写完 “ android Notification 的使用 ”的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台

PI2024的专栏 1万+

android 后台处理事情_深入解析Android系统中应用程序前后台切换的实现要点

在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。我们都知道,一个Activity 可以启动另一个Activity,即使这个Activity是定义在别一个应用程序里的,比如说,想要给用户展示一个地图的信息,现在已经有一个Activity可以做这件事情,那么现在你的Activity需要做的就是将请求信息放进一个Intent对象里,并且将这个Intent对象传递给...

weixin_39950470的博客 572

安卓APP开启锁屏通知&微信、qq顶部消息通知

这几天在做安卓的推送对接,因为内网的使用场景以及费用问题,公司使用RabbitMQ的框架进行消息推送,但是在完成了简单的推送以及接受代码之后。APP消息通知遇到了两个问题:1.没有类似于微信的锁屏通知,2.没有类似于微信收到消息之后的顶部通知。在经过两天的摸索之后有了答案,先看下实际的实现效果图吧(部分通知内容因为隐私问题进行了模糊处理): 哈哈,这个不知道是不是你想要的效果,如果是的话,请继续往下看: 起初,我以为顶部通知以及锁屏通知都是开发自定义做的,所以在网上百度...

天麟江的博客 4044

Android Notification 的使用

“ Android Notification 的使用 ” 的时候,发现有几个问题,特别是设置Notification的Intent使之能够像 QQ 或其他程序一样能够正确回调到之前已经放置在后台的Task中的对应Activity,而不是创建它的一个新实例。当然重点便是如何设置该

Dream It Possible 1625

Android 实现微信,QQ的程序前后台切换 back键切换后台 点击通知栏恢复前台

Android 实现微信,QQ的程序前后台切换 back键切换后台 点击通知栏恢复前台

hfuuhgcc的博客 450

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, 结果总是存在好几个同样的activity,就算要返回的activity正在前台,点击消息后也会重新打开一个一样的activity,返回好几次才能退出, 而不能像qq之类的点击通知栏消息回到之前存在的activity,如果存在就不再新建一个activity 说的有点绕,如果是遇到此类问题的肯定能

阳光灿烂的日子的博客 845
上一篇: Android 判断SIM卡属于哪个移动运营商
下一篇: 苹果iOS 6正式版更新详细教程
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值