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

前言

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

问题场景

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Android 通知使用权(NotificationListenerService)的使用

    Android  通知使用权(NotificationListenerService)的使用 简介 当下不少第三方安全APP都有消息管理功能或者叫消息盒子功能,它们能管理过滤系统中的一些无用消息,使得消息栏更清爽干净.其实此功能的实现便是使用了Android中提供的通知使用权权限.Android4.3后加入了通知使用权NotificationListenerService,就是说当你开发的APP拥有此权限后便可以监听当前系统的通知的变化,在Android4.4后还扩展了可以获取通知详情信息.下面

  • android 设置闹钟及通知示例

    简单说一下这次demo内容,首先做一个设置一次性闹钟,先得到alarmManager,打开一个时间对话框,在里面设置闹钟的时间,时间一到发送广播,然后广播接受者接到跳转到新的activity播放音乐.接着是一个反复闹钟,最后是一个简单的通知,具体代码如下: import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.

  • 详解Android通知栏沉浸式/透明化完整解决方案

    Google在Android 4.4版本加入了半透明的界面样式,在Android 5.0的时候推出了Material Design的概念. 这些样式的加入使得原本死板.丑陋.和App颜色不一致的通知栏变得更亲和.顺眼.用户体验更友好. 作者是常年做对日项目的,对日项目以界面简洁功能强大而著称.最近客户要求UI方面做一些改变,让App看上去给用户感觉更友好.所以就提到了Android 4.4以后的通知栏问题. 网上关于通知栏的文章铺天盖地,什么沉浸式,什么半透明...挺会拽词.也不乏有Androi

  • Android仿淘宝头条基于TextView实现上下滚动通知效果

    最近有个项目需要实现通知栏的上下滚动效果,仿淘宝头条的那种. 我从网上看了一些代码,把完整的效果做了出来.如图所示: 具体代码片段如下: 1.在res文件夹下新建anmin文件夹,在这个文件夹里创建两个文件 (1).anim_marquee_in.xml进入时动画 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/ap

  • android使用NotificationListenerService监听通知栏消息

    NotificationListenerService是通过系统调起的服务,在应用发起通知时,系统会将通知的应用,动作和信息回调给NotificationListenerService.但使用之前需要引导用户进行授权.使用NotificationListenerService一般需要下面三个步骤. 注册服务 首先需要在AndroidManifest.xml对service进行注册. <service android:name=".NotificationCollectorService&q

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

    前言 最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习. 问题场景 用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的Activity.应用启动后,如果当前界面不是会话界面,那么新消息会在通知栏显示消息提醒,然后点击会话消息后却进不了会话的Activity,即点击了通知栏通知后,系统都没有启动指定Activity的意思,没有看到系统启动Activity的Log,到是会看到系统处理这个Activity的影子. 这个指定

  • Android中点击按钮启动另一个Activity及Activity之间传值问题

    场景 点击第一个Activity中的按钮,启动第二个Activity,关闭第二个Activity,返回到第一个Activity. 在第一个Activity中给第二个Activity传递值,第二个Activity中获取并显示. 打开第二个Activity Activity传值 实现 启动另一个Activity 在第一个Activity中的按钮的点击事件中 Button secondActivityButton = (Button)findViewById(R.id.secondActivity);

  • iOS之点击通知栏的通知进入程序的触发事件

    点击通知栏的通知进入程序时,会触发App Delegate里的方法,分为以下两种情况: 1.程序未启动(即底部任务栏里没有进程)时: 此种情况下,点击通知栏的通知进入程序,会触发以下方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 对于launchOptions参数,需要经过以下处理: NSDictionary* pushN

  • Android中点击事件的四种写法详解

    Android中点击事件的四种写法 使用内部类实现点击事件 使用匿名内部类实现点击事件 让MainActivity实现View.OnClickListener接口 通过布局文件中控件的属性 第一种方法:使用内部类 基本步骤如下: 1. 新建一个MyOnClickListener类并实现View.OnClickListener接口 2. 重写View.OnClickListener接口中的OnClick(View view)方法 3. 给Button绑定一个监听器,并监听一个点击事件 示例代码如下

  • android studio组件通信:Intend启动Activity接收返回结果

    实验目的: 熟悉和掌握Android组件间通信的方式和技巧. 实验要求: 1.运行课本的示例程序,理解组件通信的方式和过程2.设计一个主Activity和一个子Activity(Sub-Activity),使用主Activity上的按钮启动子Activity,并将子Activity的一些信息返回给主Activity,并显示在主Activity上. 可以自己设计界面和场景,也可以使用下面提供的内容: 主Activity界面上有一个“登录”按钮和一个用了显示信息的TextView,点击“登录”按钮后

  • 详解Android中点击事件的几种实现方式

    在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为以下三种: (1)Activity 实现接口方式实现点击事件(经常使用) (2)自定义方法,使用配置文件android:onclick (3)使用内部类方式实现 (4)使用匿名内部类实现介绍下几种点击事件的实现方式: 下面我们通过代码来简单演示下几种点击事件的实现方式: (1)Activity 实现

  • Android中点击隐藏软键盘最佳方法

    实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEvent()方法,获取当前触摸事件为DOWN的时候隐藏软键盘 @Override public boolean dispatchTouchEvent(MotionEvent ev) { //Finger touch screen event if (ev.getAction() == MotionEvent.ACTION_DOWN) { //

  • Android编程实现通知栏进度条效果的方法示例

    本文实例讲述了Android编程实现通知栏进度条效果的方法.分享给大家供大家参考,具体如下: /** * 通知管理工具类 * * @description: * @author ldm * @date 2016-5-3 上午9:39:56 */ public class NotificationUtil { private Context mContext; // NotificationManager : 是状态栏通知的管理类,负责发通知.清楚通知等. private Notification

  • Android后台启动Activity的实现示例

    目录 概述 原生Android ROM 定制化ROM 检测后台弹出界面权限 Android P后台启动权限 Android Q后台启动权限 总结 概述 前几天产品提了一个需求,想在后台的时候启动我们 APP 的一个 Activity,随着 Android 版本的更新,以及各家 ROM 厂商的无限改造,这种影响用户体验的功能许多都受到了限制,没办法,虽然是比较流氓的功能,但拿人钱财替人消灾,于是开启了哼哧哼哧的调研之路. 原生Android ROM 首先从 Android 的原生 ROM 开始,根

  • Android编程之通知栏的用法小结

    本文实例总结了Android编程中通知栏的用法.分享给大家供大家参考,具体如下: 很久没有使用Android的通知功能了,今天把两年前的代码搬出来一看,发现很多方法都废弃了,代码中各种删除线看的十分不爽.于是乎,打开Google,查看官方文档,学习最新的发送通知栏消息的方法. 本文中的代码均参照谷歌官方文档编写: http://developer.android.com/guide/topics/ui/notifiers/notifications.html 1.首先,获取系统的通知服务: 复制

随机推荐