关闭指定Activity

先说一个实际的场景,用户打开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();
}
}
}

/**
* 结束指定的Activity
*/
public static void finishSingleActivity(Activity activity) {
if (activity != null) {
if (activities.contains(activity)) {
activities.remove(activity);
}
activity.finish();
activity = null;
}
}

/**
* 结束指定类名的Activity 在遍历一个列表的时候不能执行删除操作,所有我们先记住要删除的对象,遍历之后才去删除。
*/
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