退出APP是需要清空所有Activity, 清空的前提是 需要记录已开启的所有 Activity。
在Application.ActivityLifecycleCallbacks的生命周期中调用add和remove操作。
public class ActivityStackHelper {
private static LinkedHashMap<Class<?>, Activity> activities = new LinkedHashMap<>();
/**
* 保存activity到集合中
*
* @param activity
*/
public static void add(Activity activity) {
if (activity == null) {
return;
}
activities.put(activity.getClass(), activity);
}
/**
* 判断指定的activity在map中是否存在
*
* @param clazz 指定的activity
*/
public static boolean isActivityExist(Class clazz) {
return clazz != null && get(clazz) != null;
}
/**
* 获取指定clazz的activity
*
* @param clazz
* @param <T>
* @return
*/
public static <T extends Activity> T get(Class<T> clazz) {
return (T) activities.get(clazz);
}
/**
* 获取当前集合中的activity
*
* @return
*/
public static int getSize() {
return activities.size();
}
/**
* 指定activity是否是activity栈中最底层的activity
*
* @param activity
* @return true,是;false,否
*/
public static boolean isLastActivity(Activity activity) {
if (activity == null) {
return false;
}
if (activities == null || activities.size() == 0) {
return false;
}
ListIterator<Map.Entry<Class<?>, Activity>> iterator =
new ArrayList<>(activities.entrySet()).listIterator(activities.size());
while (iterator.hasPrevious()) {
Map.Entry<Class<?>, Activity> next = iterator.previous();
if (next.getKey() == activity.getClass()) {
return !iterator.hasPrevious();
}
}
return false;
}
/**
* 移除集合中的activity
*
* @param activity
*/
public static void remove(Activity activity) {
if (activity == null) {
return;
}
activities.remove(activity.getClass());
}
/**
* 清空并finish所有activity
*/
public static void clearAndFinishActivity() {
Set<Map.Entry<Class<?>, Activity>> entries = activities.entrySet();
for (Map.Entry<Class<?>, Activity> entry : entries) {
Activity activity = entry.getValue();
if (!activity.isFinishing()) {
activity.finish();
}
}
activities.clear();
}
/**
* 清空并finish所有activity(除指定activity之外)
*
* @param clazzs
*/
public static void clearAndFinishOtherActivity(Class... clazzs) {
List<Class> cls = clazzs != null ? Arrays.asList(clazzs) : null;
Iterator<Map.Entry<Class<?>, Activity>> iterator = activities.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Class<?>, Activity> next = iterator.next();
Class<?> key = next.getKey();
if (cls != null && cls.contains(key)) {
continue;
}
Activity value = next.getValue();
if (!value.isFinishing()) {
value.finish();
}
iterator.remove();
}
}
/**
* 指定activity是否在运行
*
* @param clazz
* @param <T>
* @return
*/
public static <T extends Activity> boolean isActivityRunning(Class<T> clazz) {
T activity = get(clazz);
if (activity == null || activity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
return false;
} else {
return true;
}
}
/**
* 获取当前栈顶activity
*
* @return
*/
public static Activity getTopActivity() {
if (activities == null || activities.size() == 0) {
return null;
}
Iterator<Map.Entry<Class<?>, Activity>> iterator = activities.entrySet().iterator();
Map.Entry<Class<?>, Activity> next = null;
while (iterator.hasNext()) {
next = iterator.next();
}
return next != null ? next.getValue() : null;
}
/**
* 获取次栈顶activity
*
* @return
*/
public static Activity getTopSecondActivity() {
if (activities == null || activities.size() == 0) {
return null;
}
int size = activities.size();
if (size < 2){
return null;
}
int index = 1;
Iterator<Map.Entry<Class<?>, Activity>> iterator = activities.entrySet().iterator();
Map.Entry<Class<?>, Activity> next = null;
while (iterator.hasNext()) {
next = iterator.next();
if (index == size - 1){
if (next != null){
LogUtils.i("ActivityStackHelper", "secondActivity" + next.getValue());
return next.getValue();
}
}
index++;
}
return null;
}
/**
* 获取除了指定activity之外的栈顶activity
*
* @param clazz
* @return
*/
public static Activity getTopActivityExclude(Class clazz) {
if (activities == null || activities.size() == 0) {
return null;
}
Iterator<Map.Entry<Class<?>, Activity>> iterator = activities.entrySet().iterator();
Map.Entry<Class<?>, Activity> resule = null;
while (iterator.hasNext()) {
Map.Entry<Class<?>, Activity> next = iterator.next();
if (next.getKey() != clazz) {
resule = next;
}
}
return resule != null ? resule.getValue() : null;
}
}
调用使用方法
public class AppActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ActivityStackHelper.add(activity);
}
@Override
public void onActivityDestroyed(Activity activity) {
ActivityStackHelper.remove(activity);
}
}
上述工具类用到了LinkedHashMap 是为了保证顺序,其特性详见 https://blog.csdn.net/iblade/article/details/108369770