更新优化

This commit is contained in:
2026-11-03 09:04:54 +08:00
parent f67f062bfe
commit 5c1a3dc059
199 changed files with 2562 additions and 439 deletions
@@ -1,154 +1,275 @@
package cn.shangyu.gdxzExpert.base;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import java.util.Stack;
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private static Stack<Activity> activityStack1;
private static Stack<Activity> activityStack2;
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);
}
/**
* 添加积分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();
}
}
/**
* 获取当前Activity(堆栈中最后压入的)
*/
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
/**
* 结束当前Activity(堆栈中最后压入的)
*/
public void finishActivity(){
Activity activity=activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity){
if(activity!=null&&activityStack!=null){
activityStack.remove(activity);
activity.finish();
activity=null;
}
}
/**
* 结束指定的Activity
*/
public void finishActivity2(Activity activity){
if(activity!=null){
activityStack2.remove(activity);
activity.finish();
activity=null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls){
for (Activity activity : activityStack) {
if(activity.getClass().equals(cls) ){
finishActivity(activity);
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity(){
for (int i = 0, size = activityStack.size(); i < size; i++){
if (null != activityStack.get(i)){
activityStack.get(i).finish();
}
}
activityStack.clear();
android.os.Process.killProcess(android.os.Process.myPid());
}
/**
* 退出应用程序
*/
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) { }
}
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) { }
}
}