ActivityStackManager.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package com.zy.bvvm.helper;
  2. import android.app.Activity;
  3. import androidx.collection.ArrayMap;
  4. public final class ActivityStackManager {
  5. private static volatile ActivityStackManager sInstance;
  6. private ArrayMap<String, Activity> mActivitySet = new ArrayMap<>();
  7. // 当前 Activity 对象标记
  8. private String mCurrentTag;
  9. private ActivityStackManager() {}
  10. public static ActivityStackManager getInstance() {
  11. // 加入双重校验锁
  12. if(sInstance == null) {
  13. synchronized (ActivityStackManager.class) {
  14. if(sInstance == null){
  15. sInstance = new ActivityStackManager();
  16. }
  17. }
  18. }
  19. return sInstance;
  20. }
  21. /**
  22. * 获取栈顶的 Activity
  23. */
  24. public Activity getTopActivity() {
  25. return mActivitySet.get(mCurrentTag);
  26. }
  27. /**
  28. * 销毁所有的 Activity
  29. */
  30. public void finishAllActivities() {
  31. finishAllActivities((Class<? extends Activity>) null);
  32. }
  33. /**
  34. * 销毁所有的 Activity,除这些 Class 之外的 Activity
  35. */
  36. @SafeVarargs
  37. public final void finishAllActivities(Class<? extends Activity>... classArray) {
  38. String[] keys = mActivitySet.keySet().toArray(new String[]{});
  39. for (String key : keys) {
  40. Activity activity = mActivitySet.get(key);
  41. if (activity != null && !activity.isFinishing()) {
  42. boolean whiteClazz = false;
  43. if (classArray != null) {
  44. for (Class<? extends Activity> clazz : classArray) {
  45. if (activity.getClass() == clazz) {
  46. whiteClazz = true;
  47. }
  48. }
  49. }
  50. // 如果不是白名单上面的 Activity 就销毁掉
  51. if (!whiteClazz) {
  52. activity.finish();
  53. mActivitySet.remove(key);
  54. }
  55. }
  56. }
  57. }
  58. public void onActivityCreated(Activity activity) {
  59. mCurrentTag = getObjectTag(activity);
  60. mActivitySet.put(getObjectTag(activity), activity);
  61. }
  62. public void onActivityDestroyed(Activity activity) {
  63. mActivitySet.remove(getObjectTag(activity));
  64. // 如果当前的 Activity 是最后一个的话
  65. if (getObjectTag(activity).equals(mCurrentTag)) {
  66. // 清除当前标记
  67. mCurrentTag = null;
  68. }
  69. }
  70. /**
  71. * 获取一个对象的独立无二的标记
  72. */
  73. private static String getObjectTag(Object object) {
  74. // 对象所在的包名 + 对象的内存地址
  75. return object.getClass().getName() + Integer.toHexString(object.hashCode());
  76. }
  77. }