常用代碼整理:Activity 管理類(ActivityManager)

說明:大部分內容都是參考別的文章,這裏做整理是爲了以後的編程有實用的模板,可以即需即用。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章