1 简介
有时候我们是需要管理应用的 Activitiy,作一些统计、退出应用等操作。通常我们会写一个工具类,使用一个栈 Stack 管理所有的 Activity,需要在 BaseActivity 中重写 onCreate 方法,使用工具类将 Activity 添加到栈中,在结束页面时要将 Activity 从栈中移除。
其实 Application 有一个内部类 ActivityLifecycleCallbacks ,我们可以在 Application 中注册这个回调(registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) 方法),用于监听应用中所有 Activity 的生命周期,这个非常有用,我们同样可以用一个 栈 Stack 结合 ActivityLifecycleCallbacks 的回调方法,来管理应用的 Activity。
2 代码
利用 Appliaton 的 ActivityLifecycleCallbacks 管理 Activity,参考代码如下:
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import java.util.Stack;
public class BaseApplication extends Application {
public static BaseApplication mApp;
private static Stack<Activity> mActivityStack;
private int mForegroundActivityCount = 0;
public static Context getAppContext() {
return mApp.getApplicationContext();
}
public static BaseApplication getApp() {
return mApp;
}
@Override
public void onCreate() {
super.onCreate();
mApp= this;
mActivityStack = new Stack<>();
initRegister();
}
private void initRegister() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
mActivityStack.add(activity);
}
@Override
public void onActivityStarted(Activity activity) {
mForegroundActivityCount++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
mForegroundActivityCount--;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
mActivityStack.remove(activity);
}
});
}
/**
* 前台Activity的个数
* @return > 0,处于前台;= 0,退到后台。
*/
public int getForegroundActivityCount(){
return mForegroundActivityCount;
}
/**
* 是否在后台
* @return
*/
public boolean isInBackground() {
return mForegroundActivityCount <= 0;
}
/**
* 当前Activity
*/
public static Activity getCurrActivity() {
return mActivityStack.lastElement();
}
/**
* 退出应用
*/
public void exitApp() {
finishAllActivities();
killProcess();
}
/**
* 关闭所有Activity
*/
public void finishAllActivities() {
// 先打印当前容器内的Activity列表
for (Activity activity : mActivityStack) {
Log.d("Application", activity.getLocalClassName());
}
// 逐个退出Activity
for (Activity activity : mActivityStack) {
activity.finish();
}
}
public void killProcess() {
// 方式1:android.os.Process.killProcess()
android.os.Process.killProcess(android.os.Process.myPid());
// 方式2:System.exit()
// System.exit() = Java中结束进程的方法:关闭当前JVM虚拟机
System.exit(0);
// System.exit(0)和System.exit(1)的区别
// 1. System.exit(0):正常退出;
// 2. System.exit(1):非正常退出,通常这种退出方式应该放在catch块中。
}
@Override
public void onTerminate() {
super.onTerminate();
mActivityStack = null;
mApp = null;
}
}
另参考:https://blog.csdn.net/u010072711/article/details/77090313