极光推送-点击通知栏跳到指定页面

2023-05-16

在MyReceiver接收器里面,添加以下代码:


if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户点击打开了通知");
           //打开自定义的Activity
           Intent i = new Intent(context, ArticleActivity.class);
           i.putExtras(bundle);
           i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           context.startActivity(i);
        }  

由于是在广播接收器里面启动Activity,所以要添加Flag:FLAG_ACTIVITY_NEW_TASK,表示新创建一个task来存放启动的Activity。那为什么就要设置这么一个Flag呢,不能引用原来的task吗,答案是确实不能。普通情况下,要有前一个Activity的Context才能启动另外一个Activity。startActivity()源码中有这么一个描述:

 *   Note that if this method is being called from outside of an 
 *   {@link android.app.Activity} Context, then the Intent must include 
 *   the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag.  This is because, 
 *   without being started from an existing Activity, there is no existing 
 *   task in which to place the new activity and thus it needs to be placed 
 *   in its own separate task.
设置该Flag的效果与模式设置为SingleTask的效果是一样。

如果要跳转到该Activity时,并清除掉之前的Activity,那么就可以将跳转到的Activity启动模式设置为singleTask。


<!--主页面-->
<activity android:name=".activity.MainActivity"
    android:launchMode="singleTask"/>  

-------20170414更新---------

最近发现了一个问题,就是如果我们的应用已经退出了,但极光推送的服务还在运行,这时候推了一条通知过来,这时我们是否应该要判断一下应用是否还在运行?因为你如果不去判断的话,比如此时应该退出了,但你点击通知,直接打开文章详情Activity,就会比原来流程少了启动页->主页(->文章详情),你肯定会在启动页或主页做一些初始化的,这时直接跳过初始化肯定会有问题的。所以我们要做应用是否还在运行的判断,看到网上有一些是用进程(5.0以上)和任务栈(5.0以下)去判断,我觉得没必要这样,因为利用进程去判断时,明明应用已经退出,但进程还在,会导致误判。我们可以换另外一种思路来判断应用是否正在运行:去判断任务栈中存在的Activity个数,如果Activity数都为0了,那应用肯定退出了,不再运行了。而判断Activity数可以自己创建一个类去管理Activity,代码如下:

package com.wesdom.realstuffshop.utils;

import android.app.Activity;

import java.util.ArrayList;
import java.util.List;

/**
 * Activity管理器
 * Created by sen young on 2017/5/18 11:25.
 * 邮箱:595327086@qq.com.
 */

public class MyActivityManager {

    private static List<Activity> activityList = new ArrayList<Activity>();
    private static MyActivityManager instance;

    public static MyActivityManager getInstance() {
        if (instance == null) {
            instance = new MyActivityManager();
        }
        return instance;
    }

    /**
     * 添加 Activity 到列表
     *
     * @param activity activity
     */
    public static void addActivity(Activity activity) {
        if (activityList == null) {
            activityList = new ArrayList<Activity>();
        }
        activityList.add(activity);
    }

    /**
     * 获取界面数量
     *
     * @return activity size
     */
    public static int getActivitySize() {
        if (activityList != null) {
            return activityList.size();
        }
        return 0;
    }

    /**
     * 获取当前 Activity - 堆栈中最后一个压入的
     *
     * @return current Activity
     */
    public static Activity getCurrentActivity() {
        if (activityList != null && activityList.size() > 0) {
            Activity activity = activityList.get(activityList.size() - 1);
            return activity;
        }
        return null;
    }

    /**
     * 获取指定类名的 Activity
     *
     * @param cls 指定的类
     * @return Activity
     */
    public static Activity getActivity(Class<?> cls) {
        if (activityList == null) {
            return null;
        }
        for (Activity activity : activityList) {
            if (activity.getClass().equals(cls)) {
                return activity;
            }
        }
        return null;
    }

    /**
     * 结束指定的 Activity
     *
     * @param activity Activity
     */
    public static void removeActivity(Activity activity) {
        if (activity != null) {
            activityList.remove(activity);
        }
    }

    /**
     * 结束指定类名的 Activity
     *
     * @param cls 指定的类
     */
    public static void removeActivity(Class<?> cls) {
        if (activityList == null) {
            return;
        }
        for (Activity activity : activityList) {
            if (activity.getClass().equals(cls)) {
                activityList.remove(activity);
            }
        }
    }

    /**
     * 结束所有Activity
     */
    public static void finishAllActivity() {
        if (activityList == null) {
            return;
        }
        int size = activityList.size();
        for (int i = 0; i < size; i++) {
            if (null != activityList.get(i)) {
                activityList.get(i).finish();
            }
        }
        activityList.clear();
    }

    /**
     * 结束其他所有的Activity
     *
     * @param activity 不需要销毁的Activity
     */
    public static void finishOtherAllActivity(Activity activity) {
        if (activityList == null) {
            return;
        }
        for (int i = 0, size = activityList.size(); i < size; i++) {
            if (activity != activityList.get(i)) {
                activityList.get(i).finish();
                activityList.remove(i);
            }
        }
    }

}
使用这个类有两种方法:

(1),在BaseActivity的生命周期中调用

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    MyActivityManager.addActivity(this);
}
@Override
protected void onDestroy() {
    MyActivityManager.removeActivity(this);
}

(2),通过实现Application.ActivityLifecycleCallbacks里面的两个方法,并在MyApplication中去注册这个回调

a,在自己的MyApplication中添加回调:

registerActivityLifecycleCallbacks(this);
b,实现的相关方法中添加以下代码:

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        MyActivityManager.addActivity(activity);
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        MyActivityManager.removeActivity(activity);
    }
这样,我们新启动或销毁Activity就会自己调用实现的方法。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

极光推送-点击通知栏跳到指定页面 的相关文章

随机推荐

  • AMD IOMMU与Linux (4) -- Domain, Group, Device

    1 domain的本质是一个页表 xff0c 1对1的关系 2 IOMMU DOMAIN UNMANAGED vs IOMMU DOMAIN DMA a IOMMU DOMAIN UNMANAGED DMA mappings managed
  • 第三篇:知其然,知其所以然-USB音频设备的开发过程

    最近 xff0c 有朋友正好在开发一个USB音频设备 xff0c 所以询问我一些USB音频设备开发方面的技术细节问题 xff1b 也和音响发烧友聊到USB音频设备的实现方式与其优缺点 xff1b 后来 xff0c 也和人谈到实现一个USB音
  • 第七篇:风起于青萍之末-电源管理请求案例分析(下)

    第五篇 风起于青萍之末 电源管理请求案例分析 上 http blog csdn net u013140088 article details 18180249 第六篇 风起于青萍之末 电源管理请求案例分析 中 http blog csdn
  • 回溯算法(BackTracking)--八皇后问题

    0 xff09 回溯算法 xff1a 回溯算法也算是遍历算法的一种 xff0c 回溯算法是对Brute Force算法的一种改进算法 xff0c 一个典型的应用是走迷宫问题 xff0c 当我们走一个迷宫时 xff0c 如果无路可走了 xff
  • 第十九篇:USB Audio/Video Class设备协议

    转发请注明出处 随着项目的不断进行 我想在网上查找了一下USB Audio Video的最新资料 看看有没有业内人士的更新 由于我们的项目一直在技术的最前延 而且这个USB IF官方发布的协议 也非常非常新 结果找了半天 都是我这篇文章的转
  • 第三十二篇:Windbg中USB2.0调试环境的搭建

    2011年的时候 xff0c 为了开发USB Mass storage UASP USB attached SCSI Protocol 的设备驱动程序 xff0c 从米国买了两个USB2 0的调试小设备 xff08 如下图 xff0c 每个
  • 理解SerDes 之一

    理解SerDes FPGA发展到今天 xff0c SerDes Serializer Deserializer 基本上是标配了 从PCI到PCI Express 从ATA到SATA xff0c 从并行ADC接口到JESD204 从RIO到S
  • 理解SerDes 之二

    理解SerDes 之二 2012 11 11 21 17 12 转载 标签 xff1a dfe serdes it 2 3 接收端均衡器 Rx Equalizer 2 3 1 线形均衡器 Linear Equalizer 接收端均衡器的目标
  • USB3.0的物理层测试探讨

    USB简介 USB Universal Serial Bus 即通用串行总线 xff0c 用于把键盘 鼠标 打印机 扫描仪 数码相机 MP3 U盘等外围设备连接到计算机 xff0c 它使计算机与周边设备的接口标准化 在USB1 1版本中支持
  • ARM SoC漫谈

    作者 xff1a 重走此间路 链接 xff1a https zhuanlan zhihu com p 24878742 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 芯片厂商向客户介
  • linux下实现生产者消费者问题

    生产者 xff08 producer xff09 和消费者 xff08 consumer xff09 问题是并发处理中最常见的一类问题 xff0c 是一个多线程同步问题的经典案例 可以这样描述这个问题 xff0c 有一个或者多个生产者产生某
  • 解决Ubuntu下每隔几分钟自动锁屏,需要重新输入密码的问题

    看到这篇文章 xff0c 很实用 xff0c mark xff01 http www cnblogs com lanxuezaipiao p 3617436 html
  • Android NFC详解

    1 NFC概览 NFC xff0c 全称是Near Field Communication xff0c 中为近场通信 xff0c 也叫做近距离无线通信技术 使用了NFC技术的设备 xff08 例如移动电话 xff09 可以在彼此靠近的情况下
  • Microsoft VBScript 运行时错误 错误 '800a01a8' 缺少对象: ''

    Microsoft VBScript 运行时错误 错误 39 800a01a8 39 缺少对象 39 39 通常是这个对象已经关闭了 xff0c 你现在又关闭一次 xff01 xff01
  • 0/1背包问题之穷举解法

    0 1背包问题 有一个背包 xff0c 背包容量是M 61 150kg 有7个物品 xff0c 物品不可以分割成任意大小 xff08 这句很重要 xff09 要求尽可能让装入背包中的物品总价值最大 xff0c 但不能超过总容量 物品 A B
  • 把数据转换成json格式的字符串

    最近写程序遇到一个问题 xff0c 把一些数据转换成json格式的字符串保存起来 xff0c 这些数据有普通的键值对 xff0c 还有列表类型的 xff0c 下面写了一个小例子 xff0c 列表数据以复选框CheckBox形式来展示 xff
  • 解决Ubuntu12.04循环登录的问题

    今天用VMvare登录Ubuntu xff0c 发现用户名密码正确的情况下 xff0c 登录不进去 xff0c 循环出现登录界面 xff0c 但是guset可以登录 xff0c 在网上查找资料 xff0c 找到了解决的办法 xff1a 1
  • 美团2018春招笔试题

    任意一个正整数可以用字符 0 9 表示出来 但是当这些字符每种字符数量有限时 xff0c 可能有些正整数表示不出来 比如有两个 1 xff0c 一个 2 xff0c 能表示出11 12 112等等 xff0c 但是无法表示出10 122 2
  • GooglePlay - 排行榜及支付接入

    前言 Google Play应用商店在国外Android市场中地位基本与AppStore在IOS中的地位一致 xff0c 为此考虑国外的应用时 xff0c Android首要考虑的是接入GooglePlay的排行榜等支持 同样的由于Goog
  • 极光推送-点击通知栏跳到指定页面

    在MyReceiver接收器里面 xff0c 添加以下代码 xff1a if JPushInterface ACTION NOTIFICATION OPENED equals intent getAction Log d TAG 34 My