iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >关于Android中点击通知栏的通知启动Activity问题解决
  • 873
分享到

关于Android中点击通知栏的通知启动Activity问题解决

activityAndroid 2022-06-06 11:06:20 873人浏览 独家记忆
摘要

前言 最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。 问题场景 用小米手机使用小米推送一条消息,然后点击通知栏中的消息

前言

最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习

问题场景

用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的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在运行。



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 8.0系统中通知栏的适配微技巧Android通知栏微技巧一些需要注意的小细节Android编程实现通知栏进度条效果的方法示例Android开发实现判断通知栏是否打开及前往设置页面的方法Android之开发消息通知栏详解Android通知栏沉浸式/透明化完整解决方案Android编程实现上方通知栏里闪动效果的方法Android 使用AlarmManager和NotificationManager来实现闹钟和通知栏Android编程之通知栏的用法小结android使用NotificationListenerService监听通知栏消息Android种使用Notification实现通知管理以及自定义通知栏实例(示例四)Android 8.0系统中通知栏的适配详解


--结束END--

本文标题: 关于Android中点击通知栏的通知启动Activity问题解决

本文链接: https://www.lsjlt.com/news/28359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作