Android Activity管理類

那麼我們要怎麼來實現Activity的管理呢?

 

大家都知道,Android系統有自己的Activity管理機制,也就是 Activity Stack(棧)。奉行着 先進後出,後進先出的原則。那麼我們就通過Stack來進行Activity的管理。

 

第一步,肯定是創建 Stack<Activity>集合。然後根據Stack<Activity>集合的方法進行操作。

 

實現包括:添加Activity到堆棧、獲取當前的Activity(堆棧最後一個)、結束當前的Activity(堆棧最後一個)、結束指定的Activity、結束指定類名的Activity、結束所有的Activity等方法。

 

 

 


 
  1. /**

  2. * Activity管理類

  3. *

  4. */

  5. public class AppManager {

  6.  

    /** 堆棧管理對象 */
    private static final ActivityStack STACK = new ActivityStack();
    /** 當前顯示的Activity */
    private static WeakReference<Activity> topActivity;
    /** 額外操作 */
    private static ExtraOperations         operations;
  7. private static Stack<Activity> activityStack;

  8. private static AppManager instance;

  9. private AppManager() {

  10. }

  11. /**

  12. * 單一實例

  13. */

  14. public static AppManager getAppManager() {

  15. if (instance == null) {

  16. instance = new AppManager();

  17. }

  18. return instance;

  19. }

  20.  

    /**
     * 從堆棧中刪除指定對象
     */
    public boolean removeFromStack(Activity activity) {
        for (WeakReference<Activity> weak : activityStack) {
            final Activity act = weak.get();
            if (act == activity) {
                return activityStack.remove(weak);
            }
        }
        return false;
    }
    /**
  21.  * 獲取當前顯示的activity
     */
    public static Activity peek() {
        if (null != topActivity && null != topActivity.get()) {
            return topActivity.get();
        } else {
            return STACK.peekFromStack();
        }
    }
    /**
     * 退出APP
     */
    public static void onExit() {
        final long now = System.currentTimeMillis();
        if (now <= lastExitPressedMills + MAX_DOUBLE_EXIT_MILLS) {
            BqsDF.destroy();
            finishAll();
            if (null != operations) {
                operations.onExit();
            }
            System.exit(0);
        } else {
            if (null != peek()) {
                ToastUtil.toast(R.string.app_exit);
            }
            lastExitPressedMills = now;
        }
    }
  22. /**

  23. * 添加Activity到堆棧

  24. */

  25. public void addActivity(Activity activity) {

  26. if (activityStack == null) {

  27. activityStack = new Stack<Activity>();

  28. }

  29. activityStack.add(activity);

  30. }

  31. /**

  32. * 獲取當前Activity(堆棧中最後一個壓入的)

  33. */

  34. public Activity currentActivity() {

  35. Activity activity = activityStack.lastElement();

  36. return activity;

  37. }

  38. /**

  39. * 結束當前Activity(堆棧中最後一個壓入的)

  40. */

  41. public void finishActivity() {

  42. Activity activity = activityStack.lastElement();

  43. finishActivity(activity);

  44. }

  45. /**

  46. * 結束指定的Activity

  47. */

  48. public void finishActivity(Activity activity) {

  49. if (activity != null) {

  50. activityStack.remove(activity);

  51. activity.finish();

  52. activity = null;

  53. }

  54. }

  55. /**

  56. * 結束指定類名的Activity

  57. */

  58. public void finishActivity(Class<?> cls) {

  59. for (Activity activity : activityStack) {

  60. if (activity.getClass().equals(cls)) {

  61. finishActivity(activity);

  62. }

  63. }

  64. }

  65. /**

  66. * 結束所有Activity

  67. */

  68. public void finishAllActivity() {

  69. for (int i = 0, size = activityStack.size(); i < size; i++) {

  70. if (null != activityStack.get(i)) {

  71. activityStack.get(i).finish();

  72. }

  73. }

  74. activityStack.clear();

  75. }

  76. /**

  77. * 退出應用程序

  78. */

  79. @SuppressWarnings("deprecation")

  80. public void AppExit(Context context) {

  81. try {

  82. finishAllActivity();

  83. ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

  84. activityManager.restartPackage(context.getPackageName());

  85. System.exit(0);

  86. } catch (Exception e) {

  87. e.printStackTrace();

  88. }

  89. }

  90.  

    public interface ExtraOperations {
        /** APP退出時需要額外處理的事情,例如廣播的反註冊,服務的解綁 */
        void onExit();
    
        /** activity 銷燬時需要額外處理的事情,例如finish動畫等 */
        void onActivityFinish(Activity activity);
    }
  91. }

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