android开发游记:关闭所有Activity安全退出应用的方法总结

在开发中经常会出现这种情况,我们在某一个页面上希望用户关闭应用所有已打开页面,但是当前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); 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值