package cn.shangyu.gdxzExpert.base; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.os.Build; import java.util.Stack; import cn.shangyu.gdxzExpert.utils.LogUtil; public class AppManager { private static Stack activityStack; private static AppManager instance; private static Stack activityStack1; private static Stack activityStack2; // 当前resumed的Activity,通过ActivityLifecycleCallbacks跟踪 private static Activity currentResumedActivity; private AppManager(){} /** * 单一实例 */ public static AppManager getAppManager(){ if(instance==null){ instance=new AppManager(); } return instance; } /** * 添加Activity到堆 */ public void addActivity(Activity activity){ if(activityStack==null){ activityStack=new Stack(); } activityStack.add(activity); LogUtil.i("AppManager", "addActivity -> " + (activity == null ? "null" : activity.getClass().getSimpleName()) + ", stackSize=" + activityStack.size()); logActivityStackInternal("addActivity"); } /** * 添加积分Activity到堆 */ public void addActivity1(Activity activity){ if(activityStack1==null){ activityStack1=new Stack(); } activityStack1.add(activity); } /** * 添加一问多答Activity到堆 */ public void addActivity2(Activity activity){ if(activityStack2==null){ activityStack2=new Stack(); } activityStack2.add(activity); } /** * 结束所有积分Activity */ public void finishAllActivity1(){ if (activityStack1!=null) { for (int i = 0, size = activityStack1.size(); i < size; i++){ if (null != activityStack1.get(i)){ activityStack1.get(i).finish(); } } activityStack1.clear(); } // android.os.Process.killProcess(android.os.Process.myPid()); } /** * 结束所有一问多答Activity */ public void finishAllActivity2(){ if (activityStack2!=null) { for (int i = 0, size = activityStack2.size(); i < size; i++){ if (null != activityStack2.get(i)){ activityStack2.get(i).finish(); } } activityStack2.clear(); } } /** * 设置当前resumed的Activity(由ActivityLifecycleCallbacks调用) */ public static void setCurrentResumedActivity(Activity activity) { currentResumedActivity = activity; LogUtil.i("AppManager", "setCurrentResumedActivity -> " + (activity == null ? "null" : activity.getClass().getSimpleName())); logActivityStackInternal("setCurrentResumedActivity"); } /** * 获取当前resumed的Activity(用于生命周期回调中比较) */ public static Activity getCurrentResumedActivity() { return currentResumedActivity; } /** * 清除当前resumed的Activity(当Activity销毁时调用) */ public static void clearCurrentResumedActivity(Activity activity) { if (currentResumedActivity == activity) { currentResumedActivity = null; LogUtil.i("AppManager", "clearCurrentResumedActivity -> set currentResumedActivity = null"); logActivityStackInternal("clearCurrentResumedActivity"); } } /** * 检查Activity是否有效(未finish且未destroy) */ private boolean isActivityValid(Activity activity) { if (activity == null) { return false; } if (activity.isFinishing()) { return false; } // isDestroyed()方法在API 17及以上才可用 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { if (activity.isDestroyed()) { return false; } } return true; } /** * 获取当前Activity(优先返回resumed的Activity,否则返回堆栈中最后压入的) */ public Activity currentActivity(){ // 优先返回当前resumed的Activity if (isActivityValid(currentResumedActivity)) { LogUtil.i("AppManager", "currentActivity -> use currentResumedActivity: " + currentResumedActivity.getClass().getSimpleName()); return currentResumedActivity; } LogUtil.i("AppManager", "currentActivity -> currentResumedActivity invalid or null, try activityStack"); // 如果resumed的Activity不可用,则从堆栈中获取 if(activityStack == null || activityStack.isEmpty()){ LogUtil.i("AppManager", "currentActivity -> activityStack is null or empty"); return null; } // 从堆栈末尾开始查找,找到第一个未销毁的Activity for (int i = activityStack.size() - 1; i >= 0; i--) { Activity activity = activityStack.get(i); if (isActivityValid(activity)) { LogUtil.i("AppManager", "currentActivity -> use stack[" + i + "]: " + activity.getClass().getSimpleName()); return activity; } } LogUtil.i("AppManager", "currentActivity -> no valid Activity found in stack"); return null; } /** * 结束当前Activity(堆栈中最后压入的) */ public void finishActivity(){ if(activityStack == null || activityStack.isEmpty()){ return; } Activity activity=activityStack.lastElement(); finishActivity(activity); } /** * 结束指定的Activity */ public void finishActivity(Activity activity){ if(activity!=null&&activityStack!=null){ activityStack.remove(activity); LogUtil.i("AppManager", "finishActivity -> " + activity.getClass().getSimpleName() + ", stackSize(afterRemove)=" + activityStack.size()); activity.finish(); activity=null; logActivityStackInternal("finishActivity"); } } /** * 结束指定的Activity */ public void finishActivity2(Activity activity){ if(activity!=null && activityStack2!=null){ activityStack2.remove(activity); activity.finish(); activity=null; } } /** * 结束指定类名的Activity */ public void finishActivity(Class cls){ if(activityStack == null || activityStack.isEmpty()){ return; } for (Activity activity : activityStack) { if(activity.getClass().equals(cls) ){ finishActivity(activity); } } } /** * 结束所有Activity */ public void finishAllActivity(){ if(activityStack == null || activityStack.isEmpty()){ LogUtil.i("AppManager", "finishAllActivity -> activityStack empty, kill process"); android.os.Process.killProcess(android.os.Process.myPid()); return; } for (int i = 0, size = activityStack.size(); i < size; i++){ if (null != activityStack.get(i)){ LogUtil.i("AppManager", "finishAllActivity -> finish " + activityStack.get(i).getClass().getSimpleName()); activityStack.get(i).finish(); } } activityStack.clear(); LogUtil.i("AppManager", "finishAllActivity -> stack cleared, size=" + activityStack.size()); android.os.Process.killProcess(android.os.Process.myPid()); } /** * 打印当前 activityStack 和 currentResumedActivity 的详细信息,方便排查 currentActivity 为空的问题 */ public static void logActivityStackInternal(String from) { if (activityStack == null || activityStack.isEmpty()) { LogUtil.i("AppManager", "[" + from + "] activityStack is empty, currentResumedActivity=" + (currentResumedActivity == null ? "null" : currentResumedActivity.getClass().getSimpleName())); return; } StringBuilder sb = new StringBuilder(); sb.append("[").append(from).append("] activityStack size=").append(activityStack.size()); sb.append(", currentResumedActivity=") .append(currentResumedActivity == null ? "null" : currentResumedActivity.getClass().getSimpleName()); sb.append(", stack=["); for (int i = 0; i < activityStack.size(); i++) { Activity a = activityStack.get(i); sb.append(i) .append(":") .append(a == null ? "null" : a.getClass().getSimpleName()); if (i != activityStack.size() - 1) { sb.append(", "); } } sb.append("]"); LogUtil.i("AppManager", sb.toString()); } /** * 退出应用程序 */ public void AppExit(Context context) { try { finishAllActivity(); ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); // activityMgr.restartPackage(context.getPackageName()); activityMgr.killBackgroundProcesses(context.getPackageName()); System.exit(0); android.os.Process.killProcess(android.os.Process.myPid()); } catch (Exception e) { } } }