时间:2021-05-19
前言
最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。
问题场景
用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的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在运行。
拓展
但是上面的方法在小米手机上凑效了,但在华为手机上还是有问题,即使同样的场景。华为又坑爹了!
于是开始从上面的ActivityManager.RunningAppProcessInfo类中的importance变量的状态入手,然后测试各种场景可能出现的变量值,结果发现效果不尽人意,有些场景问题依旧。
最后,又换种思路:不从Activity A开始启动应用,换个Activity B,也就是在调用PendingIntent.getActivity()方法传入Intent对象使用B的class。启动B会发现应用没有被初始化,则跳转到A执行初始化,然后再走正常流程。
再针对各种场景以及各种机型测试,发现问题解决。从上面可以看出,虽然不懂背后原理,但解决问题的思路一定要广,特别是在急着发版本的时候,不要在一棵树上吊死。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android的App启动时白屏的问题解决办法在手机上调试后第一次启动后会等待很长时间白屏,设置style样式,给activity加上设置的样式,完美解决参考一
Android编译出错版本匹配问题解决办法解决问题的关键在于版本匹配,compileSdkVersioncompileSdkVersiontargetSdkVe
陌陌没有提示音解决方法如下: 1、检查陌陌设置中的消息通知; 2、在陌陌的设置列表中点击“消息通知”一栏; 3、随后请检查消息通知选项是否为打开状态;
点击通知栏的通知进入程序时,会触发AppDelegate里的方法,分为以下两种情况:1、程序未启动(即底部任务栏里没有进程)时:此种情况下,点击通知栏的通知进入
华为智慧视觉关闭方法如下: 1、首先,打开手机中的“设置”菜单; 2、在“设置”中点击“通知和状态栏”; 3、然后点击“通知管理”; 4、在通知中心找到