前言

最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。
问题场景
用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的Activity。应用启动后,如果当前界面不是会话界面,那么新消息会在通知栏显示消息提醒,然后点击会话消息后却进不了会话的Activity,即点击了通知栏通知后,系统都没有启动指定Activity的意思,没有看到系统启动Activity的Log,到是会看到系统处理这个Activity的影子。
这个指定的Activity不是会话的Activity,而是在AndroidManifest.xml文件中指定android.intent.category.LAUNCHER的Activity A。也就是说有会话消息都是先从这个A开始,然后把数据往后面的Activity传。
这里显示通知有两种方式,一种是由手机系统在通知栏弹出,比如小米手机上使用小米推送,华为手机上使用华为推送,另外一种是由应用的远程进程弹出。
启动应用的第一个Activity A也有两种方式,一种是直接通过new来构造一个Intent,然后传入Activity A的class;另外一种是通过context.getPackageManager().getLaunchIntentForPackage(context.getPackageName())来获取启动的Activity A的Intent。然后调用PendingIntent.getActivity()方法,将得到的intent传入。
那么问题来了,如果是点击系统弹出的通知栏或者远程进程弹出的通知栏,如果只是使用其中一种启动方式启动应用,那么在应用启动后,点击通知栏中由后台远程进程弹出的新消息通知,这个时候就不能进入会话的Activity。从系统的日志来看,没有启动Activity,只是对Activity做了处理。
可能有人会想到是不是要加一个Intent.FLAG_ACTIVITY_NEW_TASK标识,因为在getLaunchIntentForPackage()方法中加了这个标识。
最后测试发现,只要应用没有被启动,不管是点击系统弹出的通知栏还是远程进程弹出的通知栏,如果再收到新消息通知,再点击通知栏,就能进入会话Activity了。那只要判断应用中是否有Activity被启动就OK了,貌似问题可以解决了。
问题解决
于是用了下面的逻辑来判断是否有前台Activity在运行。
/**
* 判断UI进程是否正在运行
* @return 返回true表示正在运行,否则没有运行
*/
public static boolean isForegroundRunning() {
ActivityManager am = (ActivityManager) EimCloud.getContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();
if (list != null) {
for (ActivityManager.RunningAppProcessInfo info : list) {
if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& EimCloud.getContext().getPackageName().equals(info.processName)) {
return true;
}
}
}
return false;
}
拓展
但是上面的方法在小米手机上凑效了,但在华为手机上还是有问题,即使同样的场景。华为又坑爹了!
于是开始从上面的ActivityManager.RunningAppProcessInfo类中的importance变量的状态入手,然后测试各种场景可能出现的变量值,结果发现效果不尽人意,有些场景问题依旧。
最后,又换种思路:不从Activity A开始启动应用,换个Activity B,也就是在调用PendingIntent.getActivity()方法传入Intent对象使用B的class。启动B会发现应用没有被初始化,则跳转到A执行初始化,然后再走正常流程。
再针对各种场景以及各种机型测试,发现问题解决。从上面可以看出,虽然不懂背后原理,但解决问题的思路一定要广,特别是在急着发版本的时候,不要在一棵树上吊死。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# android
# 启动activity
# 通知activity
# android通知栏启动app
# Android Fragment实现底部通知栏
# android实现常驻通知栏遇到的问题及解决办法
# Android通知栏前台服务的实现
# Android App自动更新之通知栏下载
# 适配Android 8.0版本更新安装与通知栏的一些坑
# Android 下载文件通知栏显示进度条功能的实例代码
# Android 8.0系统中通知栏的适配详解
# Android 8.0系统中通知栏的适配微技巧
# Android开发实现判断通知栏是否打开及前往设置页面的方法
# Android 通知栏的使用方法
# 弹出
# 华为
# 是在
# 机上
# 是由
# 新消息
# 栏中
# 都是
# 正在运行
# 解决了
# 来了
# 也有
# 第一个
# 是有
# 就能
# 也就
# 两种
# 不懂
# 但在
# 会在
相关文章:
如何挑选最适合建站的高性能VPS主机?
为什么Go需要go mod文件_Go go mod文件作用说明
如何在云主机上快速搭建网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何快速搭建个人网站并优化SEO?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
建站主机SSH密钥生成步骤及常见问题解答?
如何用好域名打造高点击率的自主建站?
制作网站外包平台,自动化接单网站有哪些?
Java解压缩zip - 解压缩多个文件或文件夹实例
香港服务器WordPress建站指南:SEO优化与高效部署策略
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
用v-html解决Vue.js渲染中html标签不被解析的问题
如何在香港免费服务器上快速搭建网站?
建站主机选购指南:核心配置优化与品牌推荐方案
如何用y主机助手快速搭建网站?
建站ABC备案流程中有哪些关键注意事项?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
独立制作一个网站多少钱,建立网站需要花多少钱?
如何快速搭建自助建站会员专属系统?
建站之星如何一键生成手机站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
制作网站的基本流程,设计网站的软件是什么?
网页设计与网站制作内容,怎样注册网站?
c++ stringstream用法详解_c++字符串与数字转换利器
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何自定义建站之星网站的导航菜单样式?
如何在云主机快速搭建网站站点?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何选择美橙互联多站合一建站方案?
建站主机CVM配置优化、SEO策略与性能提升指南
长沙做网站要多少钱,长沙国安网络怎么样?
建站之星备案流程有哪些注意事项?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何登录建站主机?访问步骤全解析
微课制作网站有哪些,微课网怎么进?
如何在VPS电脑上快速搭建网站?
如何在Windows 2008云服务器安全搭建网站?
如何在IIS中新建站点并配置端口与物理路径?
如何高效完成独享虚拟主机建站?
宝塔建站后网页无法访问如何解决?
如何用AWS免费套餐快速搭建高效网站?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
北京网站制作的公司有哪些,北京白云观官方网站?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
c# 在高并发场景下,委托和接口调用的性能对比
怀化网站制作公司,怀化新生儿上户网上办理流程?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。