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

作者:jacpy 时间:2023-12-17 10:08:18 

前言

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

问题场景

用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的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执行初始化,然后再走正常流程。

再针对各种场景以及各种机型测试,发现问题解决。从上面可以看出,虽然不懂背后原理,但解决问题的思路一定要广,特别是在急着发版本的时候,不要在一棵树上吊死。

来源:http://www.jacpy.com/2016/12/28/android-notification-launch-activity.html

标签:android,通知栏,启动activity
0
投稿

猜你喜欢

  • Java中IO流文件读取、写入和复制的实例

    2023-08-12 03:23:29
  • 一口气说出Java 6种延时队列的实现方法(面试官也得服)

    2022-12-15 16:40:12
  • Android自定义View实现渐变色进度条

    2022-11-25 08:27:17
  • 一步步教你如何创建第一个C#项目

    2021-08-15 04:41:56
  • Android图片处理工具类BitmapUtils

    2022-12-28 05:23:39
  • 常用Maven库,镜像库及maven/gradle配置(小结)

    2023-11-20 23:44:00
  • Fragment 多层嵌套方法调用问题的解决方案

    2023-09-29 08:12:38
  • Java实现FTP上传与下载功能

    2021-09-22 18:28:51
  • Spring Boot修改启动端口的方法

    2022-02-10 05:49:55
  • C#用Activex实现Web客户端读取RFID功能的代码

    2021-10-28 21:07:36
  • Java泛型的使用限制实例分析

    2023-05-07 20:14:52
  • Java InheritableThreadLocal用法详细介绍

    2023-01-27 04:30:11
  • maven如何打包动态环境变量(包括启动脚本)

    2023-07-16 03:48:56
  • springboot大文件上传、分片上传、断点续传、秒传的实现

    2023-06-16 02:18:30
  • Android 实现卡片堆叠钱包管理动画效果

    2021-12-12 11:15:02
  • UGUI ScrollRect滑动定位优化详解

    2021-12-06 09:56:13
  • SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)

    2023-10-02 05:20:58
  • SpringBoot Admin用法实例讲解

    2021-07-26 17:57:58
  • SpringBoot生产环境和测试环境配置分离的教程详解

    2022-04-03 22:09:47
  • c# 如何实现自动更新程序

    2021-11-20 21:02:41
  • asp之家 软件编程 m.aspxhome.com