廢話不多說,就是網(wǎng)上學(xué)習(xí)搜羅了一圈兒,然后加上自己使用過的,總結(jié)一個出來。個人認(rèn)為比較全面了,如果還有需求,留言,我們繼續(xù)改造。
直接上代碼,伸手黨可以拿走了。
package com.jafir.qingning.app.manager;
import android.app.Activity;
import android.util.Log;
import java.util.Iterator;
import java.util.Stack;
/**
* Created by jafir on 16/3/1.
*/
public class ActivityManager {
private static Stack<Activity> activityStack;
private Stack<Activity> deleteStack = new Stack<>();
private static ActivityManager instance;
private ActivityManager() {
}
public static synchronized ActivityManager getInstance() {
if (instance == null) {
instance = new ActivityManager();
if (activityStack == null) {
activityStack = new Stack<>();
}
}
return instance;
}
public Stack<Activity> getActivityStack() {
return activityStack;
}
/**
* 返回當(dāng)前棧頂?shù)腶ctivity
*
* @return
*/
public Activity currentActivity() {
if (activityStack.size() == 0) {
return null;
}
Activity activity = activityStack.lastElement();
return activity;
}
/**
* 棧內(nèi)是否包含此activity
*
* @param cls
* @return
*/
public boolean isContains(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
return true;
}
}
return false;
}
/**
* 棧內(nèi)是否包含此activity
*
* @param a
* @return
*/
public boolean isContains(Activity a) {
for (Activity activity : activityStack) {
if (activity.equals(a)) {
return true;
}
}
return false;
}
/**
* activity入棧
* 一般在baseActivity的onCreate里面加入
*
* @param activity
*/
public void pushActivity(Activity activity) {
activityStack.add(activity);
}
/**
* 移除棧頂?shù)谝粋€activity
*/
public void popTopActivity() {
Activity activity = activityStack.lastElement();
if (activity != null && !activity.isFinishing()) {
activity.finish();
}
}
/**
* activity出棧
* 一般在baseActivity的onDestroy里面加入
*/
public void popActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
}
if (!activity.isFinishing()) {
activity.finish();
activity = null;
}
}
/**
* activity出棧
* 一般在baseActivity的onDestroy里面加入
*/
public void popActivity(Class<?> cls) {
Activity deleteActivity = null;
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls) && !activity.isFinishing()) {
deleteActivity = activity;
activity.finish();
}
}
activityStack.remove(deleteActivity);
}
/**
* 從棧頂往下移除 直到cls這個activity為止
* 如: 現(xiàn)有ABCD popAllActivityUntillOne(B.class)
* 則: 還有AB存在
* <p>
* 注意此方法 會把自身也finish掉
*
* @param cls
*/
public void popAllActivityUntillOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
break;
}
if (activity.getClass().equals(cls)) {
break;
}
popActivity(activity);
}
}
/**
* 所有的棧元素 除了 cls的留下 其他全部移除
* 如: 現(xiàn)有ABCD popAllActivityUntillOne(B.class)
* 則: 只有B存在
* 注意此方法 會把自身也finish掉
*/
public void popAllActivityExceptOne(Class cls) {
//第一種 ConcurrentModificationException
// for (Activity activity : activityStack) {
// if (!activity.getClass().equals(cls) && !activity.isFinishing()) {
// activityStack.remove(activity);
// activity.finish();
// }
// }
// 第四種 ConcurrentModificationException
// for (int i = 0; i < ; i++) {
// 第三種 可行
Iterator iterator = activityStack.iterator();
while (iterator.hasNext()) {
Activity activity = (Activity) iterator.next();
if (!activity.getClass().equals(cls) && !activity.isFinishing()) {
// activityStack.remove(activity);
// 注意這里必須要用iterator的remove 上面的則錯誤
iterator.remove();
activity.finish();
}
}
//第四種 可行 稍顯復(fù)雜
// for (Activity activity : activityStack) {
// if (!activity.getClass().equals(cls) && !activity.isFinishing()) {
// deleteStack.add(activity);
// activity.finish();
// }
// }
// /**
// * 這里進(jìn)行了特殊處理,如果直接在循環(huán)里面remove會報
// * concurrentmodificationexception 錯誤
// * 所以,這里用另一個棧加入進(jìn)去,統(tǒng)一移除
// */
// activityStack.removeAll(deleteStack);
// deleteStack.clear();
Log.d("debug", "dsfsaf size+:" + activityStack.size());
}
/**
* 移除所有的activity
* 退出應(yīng)用的時候可以調(diào)用
* (非殺死進(jìn)程)
*/
public void popAllActivity() {
for (int i = 0; i < activityStack.size(); i++) {
if (null != activityStack.get(i) && !activityStack.get(i).isFinishing()) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 獲得現(xiàn)在棧內(nèi)還有多少activity
*
* @return
*/
public int getCount() {
if (activityStack != null) {
return activityStack.size();
}
return 0;
}
}
沒啥好說的,就談幾個需要注意的地方,和我遇到的問題。
注意:
- 這里在使用stack.lastElement的時候最好加一個判空
public Activity currentActivity() {
if (activityStack.size() == 0) {
return null;
}
Activity activity = activityStack.lastElement();
return activity;
}
- 看** popAllActivityUntillOne 和 popAllActivityExceptOne**
- 尤其是popAllActivityExceptOne,在這里之前遇到了坑。
- 遇到了ConcurrentModificationException的異常,之前一直以為iterator不可以刪除,但是,是我錯了,看代碼里面吧。
~~activityStack.remove(activity);~~
// 注意這里必須要用iterator的remove 上面的則錯誤
iterator.remove();
- 那幾種方法我都試過了,就選第二種iterator用吧。
Ps:其他用這個方式解決finish需求有點老了,也有一些弊端,可能出現(xiàn)內(nèi)存泄露什么的,如果這個還可以改進(jìn)的話,快點留言!我渴望知道你的答案。
通過和其他人交流,覺得event發(fā)送消息去讓activity自身finish也是一種比較好的方式,更安全。
方法我簡單說一下:
baseActivity里面,加入onMainEvent(event),event最好加入一個標(biāo)識,就是你所要finish的activity的名字吧,然后判斷一下,相等就finish,就這么簡單。