android中清除所有activity的需求,还是在蛮多场景出现的,最近项目中有遇到,把解决方法贴出来,也标记下~
首先自定义一个ActivityManager管理类,用于管理栈中的activity
public class ActivityManager {
private static final String TAG = "ActivityManager";
private static Stack<Activity> activityStack;
private static ActivityManager instance;
private Activity currActivity;
private ActivityManager() {
}
public static ActivityManager getActivityManager() {
if (instance == null) {
instance = new ActivityManager();
}
return instance;
}
//退出栈顶Activity
public void popActivity(Activity activity) {
if(activity == null || activityStack == null) {
return;
}
if(activityStack.contains(activity)) {
activityStack.remove(activity);
}
currActivity = activity;
//activity.finish();
//activity = null;
}
public void destoryActivity(Activity activity) {
if(activity == null ) {
return;
}
activity.finish();
if(activityStack.contains(activity)) {
activityStack.remove(activity);
}
activity = null;
ZLog.d(TAG, "destoryActivity=================");
}
//获得当前栈顶Activity
public Activity currentActivity() {
if(activityStack == null ||activityStack.empty()) {
return null;
}
return activityStack.lastElement();
}
//将当前Activity推入栈中
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
//退出栈中除指定的Activity外的所有
public void popAllActivityExceptOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
break;
}
if (activity.getClass().equals(cls)) {
break;
}
destoryActivity(activity);
}
}
//退出栈中所有Activity
public void popAllActivity() {
popAllActivityExceptOne(null);
}
public Activity getCurrentActivity()
{
return currActivity;
}
public int getActivityStackSize()
{
int size = 0;
if (activityStack != null)
{
size = activityStack.size();
}
return size;
}
}
然后,在你的baseActivity中的两个方法添加如下方法(如果没有baseActivity,就得一个个加了)
@Override
protected void onPause() {
super.onPause();
ActivityManager.getActivityManager().pushActivity(this);
}
@Override
protected void onResume() {
super.onResume();
ActivityManager.getActivityManager().popActivity(this);
}
最后,根据需求判断,在需要清除所有activity的地方,加上如下代码,我的是在baseActivity的onResume()方法中添加的
if(isRestart){
ActivityManager.getActivityManager().popAllActivity();
Intent intent = new Intent(this,LoadingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
isRestart = false;
this.finish();
}
注意:清楚掉所有activity后,startActivity时需要给它加上Intent.FLAG_ACTIVITY_CLEAR_TOP,表示start的这个activity置顶,并二次清除掉所有这个activity之上的activity