在开发中经常会出现这种情况,我们在某一个页面上希望用户关闭应用所有已打开页面,但是当前app已经打开多个页面并且当前所在页面并不是根页面,举个栗子,比如说:用户在修改密码页面修改了密码,成功后我们希望用户清除登录状态并跳转至登录页面,同时其他打开的页面全部关闭。那么我们要如何关闭所有页面呢?
有些人可能就会提到下面这2个方法了:
//方法1
android.os.Process.killProcess(android.os.Process.myPid());
//方法2
System.exit(0);
这两个方法都非常极端,都是通过杀死进程的方式来从外部关闭应用,同时如果你的应用有后台service的话,也会被一并杀掉。同时系统会认为你的应用是意外关闭,而不是通过正常途径关闭的。就是说你不是自然死亡的,是被人杀死的,系统会调查你为什么被杀。
那么,我们该怎么做呢?
我们需要维护一个全局List,这个List记录了当前打开的所有Activity,这样在结束应用的时候只需要把List中的Activity一一结束就行了。
下面上代码:
/**
* 维护一个activity集合,包含app运行过程中所有的活动状态的Activity
* @author Administrator
*
*/
public class MyActivityCollector {
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!=null && !activity.isFinishing()) {
activity.finish();
}
}
}
}
在每个Activity的onCreate方法中调用MyActivityCollector.addActivity(this);
在onDestroy方法中调用MyActivityCollector.removeActivity(this);
这样,在需要结束应用的时候调用MyActivityCollector.finish()就行了。
如果嫌每个Activity中都去写重复的代码很烦,可以自己抽取一个基类MyActivity,其他Activity都去继承MyActivity,就只有改在MyActivity就可以了。
最后补充一下activity启动方式的几个常识:
如果已经启动了四个Activity:A,B,C,D,在D里,想再启动一个Activity B,但不变成A,B,C,D,B,而是希望是A,B,而且B上的数据依然保留
Intent intent = new Intent(); intent.setClass(TableActivity.this, FrameActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//设置不要刷新将要跳到的界面 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//它可以关掉所要到的界面中间的activity startActivity(intent);
如果已经启动了四个Activity:A,B,C,D,在D里,想再启动一个Activity B,但不变成A,B,C,D,B,而是希望是A,B,而且B上的数据不保留
Intent intent = new Intent(); intent.setClass(TableActivity.this, FrameActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//它可以关掉所要到的界面中间的activity startActivity(intent);
如果已经启动了四个Activity:A,B,C,D,在D里,想再启动一个 Activity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以像下面写代码:
Intent intent1 = new Intent(TableActivity.this, FrameActivity.class); intent1.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent1);