Files
expert-app/app/src/main/java/cn/shangyu/gdxzExpert/base/AppManager.java
T
2026-11-03 09:04:54 +08:00

275 lines
8.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Activity> activityStack;
private static AppManager instance;
private static Stack<Activity> activityStack1;
private static Stack<Activity> 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<Activity>();
}
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<Activity>();
}
activityStack1.add(activity);
}
/**
* 添加一问多答Activity到堆
*/
public void addActivity2(Activity activity){
if(activityStack2==null){
activityStack2=new Stack<Activity>();
}
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) { }
}
}