AndroidAndroid问题汇总(遥远的回忆过去)

Android-打开通知栏并回到主页的栈管理方式

2019-11-18  本文已影响0人  MonkeyLei

新项目重构完了,哇咔咔。。简化了不少代码,重复利用了不少模块和代码,也整理下资源,从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**

image

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

3.1 添加页面到栈以及出栈

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

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读