275 lines
8.0 KiB
Java
275 lines
8.0 KiB
Java
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) { }
|
||
}
|
||
} |