先说一个实际的场景,用户打开APP,Activity1是主页,在主页选择注册,在Activity2中选择性别,然后点击下一步,跳转到Activity3填写信息信息,注册成功后,跳转到Activity4,并且要关闭Activity2和Activity3,Activity3可以在跳转到Activity4之前直接finish,但是如何关闭Activity2?本文给出了解决方法。
思路如下:我们可以定义一个缓存池,把之前所有打开的Activity页面作为对象都放进去,到最后清空一下这个缓存就行了。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) { activities.add(activity); }
public static void removeActivity(Activity activity) { activities.remove(activity); }
public static void finishAll() { for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish(); } } }
public static void finishSingleActivity(Activity activity) { if (activity != null) { if (activities.contains(activity)) { activities.remove(activity); } activity.finish(); activity = null; } }
public static void finishSingleActivityByClass(Class<?> cls) { Activity tempActivity = null; for (Activity activity : activities) { if (activity.getClass().equals(cls)) { tempActivity = activity; } }
finishSingleActivity(tempActivity); } }
|
我们在每个Activity中,都在onCreate方法中加入如下代码:比如在Activity2.java中的onCreate
1 2 3
| if (!ActivityCollector.activityList.contains(Activity2.this)) { ActivityCollector.addActivity(Activity2.this); }
|
意味着将他们加入到我们控制池里面去了,关闭Activity调用:
ActivityCollector.finishSingleActivityByClass(Activity2.class);
如果要管控左右的Activity,可以把添加移除Activity的操作写在BaseActivity中,其他Activity只要继承BaseActivity即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public abstract class BaseActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); setContentView(getLayoutId()); ButterKnife.bind(this); }
protected abstract int getLayoutId();
@Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }
|
在BaseActivity 的 onCreate()方法中调用了 ActivityCollector 的 addActivity()方法,表明将当前正在创建的活动添加到活动管理器里。然后在 BaseActivity 中重写 onDestroy()方法,并调用了 ActivityCollector 的 removeActivity()方法,表明将一个马上要销毁的活动从活动管理器里移除。
扩展阅读:Android中一个Activity关闭另一个Activity或者在一个Activity中关闭多个Activity