android 悬浮通知栏_Android-打开通知栏并回到主页的栈管理方式

本文介绍了在Android中处理悬浮通知栏点击跳转至指定页面并返回主页的问题。通过使用栈管理的方式,利用ActivityManager和PendingIntent.getActivity解决返回主界面时的页面管理。作者在重构项目后遇到一些问题,但通过这种方式找到了稳定解决方案。
摘要由CSDN通过智能技术生成

新项目重构完了,哇咔咔。。简化了不少代码,重复利用了不少模块和代码,也整理下资源,从13M左右简化到了8M做。 打包给测试测试了,然后自己也完善了,目前基本ok了。还剩下内存泄漏的详细分析,这个后面搞搞。。然后今天解决一个bug,就是MonkeyLei:通知栏推送点击跳转以及返回主界面-第二弹-完善纠正待续 之前说的通知栏跳转页面,然后返回主页面的问题。。。我检查了下,基本上就是按照之前的方式搞的,但是发现不行。。不知道哪个环节出问题了(因为目前都是继承的base页面,base页面有涉及到返回弹窗销毁等处理,我怀疑可能是这个情况,后面验证下老工程再看看吧)。

然后重新找了一个方法,就是利用栈管理的方式,当点击返回按钮的时候,进行处理。来自网友的方法,还不错,记录一波 - 你自己工程记得都封装好base页面,不然每个页面去add,remove也太累了:

1. 搞个Activity管理栈 - ActivityManager.java

import android.app.Activity;

import java.util.Stack;

public class ActivityManager {
    private static final byte[] sLock = new byte[0];

    private final Stack<Activity> mActivityStack = new Stack<>();

    private static ActivityManager sInstance;

    public static ActivityManager getInstance() {
        if (sInstance == null) {
            synchronized (sLock) {
                if (sInstance == null) {
                    sInstance = new ActivityManager();
                }
            }
        }
        return sInstance;
    }

    private ActivityManager() {
    }

    /**
     *  activity入栈
     */
    public void addActivity(Activity activity) {
        mActivityStack.add(activity);
    }

    /**
     *  activity出栈
     */
    public void removeActivity(Activity activity) {
        mActivityStack.remove(activity);
    }

    /**
     *  当栈的个数为1的时候,判断cls是否在栈内
     */
    public boolean currentActivity(Class<?> cls) {
        if (mActivityStack.size() != 1) {
            return true;
        }
        for (Activity activity : mActivityStack) {
            if (activity.getClass().equals(cls)) {
                return true;
            }
        }
        return false;
    }
}

2. 然后推送通知的地方,改用PendingIntent.getActivity

6e0b8c3348cb2591282b246c7faee9d7.png

3. 按物理返回键的地方进行如下处理 - 如果其他地方有返回处理,可能需要特别注意下(可以考虑调用一次super.onBackPressed())!

3.1 添加页面到栈以及出栈

ce3c7b5c281d03a865c76023f0159c80.png
@Override
    public void onBackPressed() {
        super.onBackPressed();
        // 栈个数为1, MainActivity不再栈内了,我们就启动它,哇咔咔...其他情况不用管!
        if (!ActivityManager.getInstance().currentActivity(MainActivity.class)) {
            toClass(BaseActivity.this, MainActivity.class);
        }
    }

9bfaa69fcea4e44e69ee4d313518b704.png

测试了,基本没啥大问题。。这种方式感觉更稳一些。

TODO 待续 之前的方式后面我再看看新工程不行的原因,然后回头记录一波.

第二天,我又继续新建了一个工程来测试PendingIntent.getActivities的方式,没问题。。。。看来我重构的工程,哪里有一定问题了(估计不好找原因),当时刚重构完友盟推送的时候应该测试的,现在找更麻烦(不过目前是采用了上面栈的方式解决了)

https://gitee.com/heyclock/doc/blob/master/NotifyToHomeTest/通知栏跳转页面_然后返回主页面_pending.getactivitys方式.zip

趁上午有点时间,我再去看下重构的工程吧。争取再瞅瞅。 如果不行,暂时先搁置,忙别的事情!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值