說明:大部分內容都是參考別的文章,這裏做整理是爲了以後的編程有實用的模板,可以即需即用。
import android.app.Activity;
import java.util.Stack;
/**
* Activity 管理類
*/
public class ActivityManager {
private Stack<Activity> activityStack;
private ActivityManager() {
}
public static final ActivityManager getInstance() {
return ActivityManagerHolder.instance;
}
private static class ActivityManagerHolder {
private static final ActivityManager instance = new ActivityManager();
}
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
public void removeActivity(Activity activity) {
if (activityStack != null) {
activityStack.remove(activity);
}
}
public Activity getActivity(Class<?> clazz) {
if (activityStack != null) {
for (Activity activity : activityStack) {
if (clazz.equals(activity.getClass())) {
return activity;
}
}
}
return null;
}
public Activity getCurrentActivity() {
if (activityStack != null) {
return activityStack.lastElement();
}
return null;
}
/**
* 獲取所有 Activity
*/
public Stack<Activity> getAllActivityStacks() {
return activityStack;
}
/**
* 結束指定的 Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
if (!activity.isFinishing()) {
activity.finish();
activityStack.remove(activity);
}
}
}
/**
* 結束指定類名的 Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
break;
}
}
}
/**
* 結束除當前傳入以外所有 Activity
*/
public void finishOthersActivity(Class<?> cls) {
if (activityStack != null) {
for (Activity activity : activityStack) {
if (!activity.getClass().equals(cls)) {
activity.finish();
}
}
}
}
/**
* 結束所有 Activity
*/
public void finishAllActivity() {
if (activityStack != null) {
for (Activity activity : activityStack) {
activity.finish();
}
}
activityStack.clear();
}
/**
* 退出 app 時調用
*/
public void exitApp() {
try {
finishAllActivity();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
對於 Activity 的管理是至關重要的,所以我們要創建 Activity 管理類用於 Activity 的管理,但是代碼之間的耦合度也是需要重點關注,如果對於每個單獨的 Activity 都分別處理入棧出棧等 Activity 管理操作,那麼對於後期維護是很困難的;傳統的方式是創建 BaseActivity,在 BaseActivity 中進行 Activity 的管理,但是並不是所有的 Activity 都會繼承 BaseActivity,對於這些 “法外之徒” 又得怎麼維護呢?
自 Android 4.0(API-14)開始,Application 中多了一個方法,可以設置全局監聽 Activity 的生命週期:registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback),通過此方法就能夠得到全局所有 Activity 生命週期的回調,因此我們可以從 Application 中全局監聽所有 Activity 並對其進行管理,也就不用在每個 Activity 中單獨處理重複的邏輯了。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ActivityManager.getInstance().addActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
ActivityManager.getInstance().removeActivity(activity);
}
});
}
}
PS:使用 Log 日誌工具作簡要測試,如需滿足較複雜的統計或調試需求時,此法可能會大大減少插入代碼量,提高效率(不用在每個 Activity 的生命週期方法中單獨打 Log 了)。
參考文章:
https://blog.csdn.net/blogblj/article/details/52068457
https://blog.csdn.net/tongcpp/article/details/40344871