Android-打开通知栏并回到主页的栈管理方式
新项目重构完了,哇咔咔。。简化了不少代码,重复利用了不少模块和代码,也整理下资源,从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**

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

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

测试了,基本没啥大问题。。这种方式感觉更稳一些。
TODO 待续 之前的方式后面我再看看新工程不行的原因,然后回头记录一波.
第二天,我又继续新建了一个工程来测试PendingIntent.getActivities的方式,没问题。。。。看来我重构的工程,哪里有一定问题了(估计不好找原因),当时刚重构完友盟推送的时候应该测试的,现在找更麻烦(不过目前是采用了上面栈的方式解决了)
趁上午有点时间,我再去看下重构的工程吧。争取再瞅瞅。 如果不行,暂时先搁置,忙别的事情!