最近在做毕业设计,其中需要写一个关闭程序的功能,用了很多方法都是得不到我想要目的

目标:退出整个程序

先介绍一下网上能找到的几个方式吧

//强制杀掉后台进程(具体可以百度) 
am.killBackgroundProcesses(getPackageName());
//JAVA中退出的方法,应该也是属于强制关闭
                    System.exit(0);
//关闭当前的Acticity
                    finish();
//依旧是强制关闭
                    android.os.Process.killProcess(android.os.Process.myPid());

一共找了这么多方法具体每个方法具体我就不在这里解释了,简单说一下结果1、3、4这三个方式关闭程序后都是像闪退一样直接关闭,但是手机判断为意外关闭,所以会强制重启,调用以后APP就会闪退然后重启。

第二种不会强制重启,但是这个方法是关闭当前活动,我们无法在一个活动内关闭其他不可见的活动。所以导致的结果就是,如果活动栈当前的活动被关闭,下一个活动回到栈顶显示出来,相当于返回了上一个活动。此处设置调用finish()的活动启动模式为singleTask也无用,因为我的这个活动是一开始通过Load界面传过来的他已经是栈顶了。(有点乱,我表达不清粗不要喷我).

所以上述方法直接调用是没有用的,这时候我需要创建一个活动管理类,用来管理所有启动的活动代码如下:

public class ActiviceCollector {
//创建活动对象的集合用来记录打开的活动
    public static List<Activity> activitys = new ArrayList<>();
//每次启动新的活动就调用这个方法添加活动的对象到上面的集合记录
    public static void addActivity(Activity activity) {
        activitys.add(activity);
    }
//在准备退出整个程序的时候,遍历List并逐一关闭
    public static void finishAll(){
        for(Activity activity:activitys)
        {
            if(!activity.isFinishing())
            {
                activity.finish();
            }
        }
    }
}

有了上面的类之后可以在每一个活动的onCreate()方法中添加一句ActiviceCollector.addAcivity(this)将创建的活动添加;

当然这样你会写很多重复代码,我在查到相关资料的时候已经快把项目写完了,没办法只好挨个去onCreate()添加。

但是如果你很有远见的一开始就想到了这里那么我建议除了创建上述代码以外再做以下的操作:

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle saveInstanceState){
    super.onCreate(savedInstanceState);
    ActivityCollector.addActivity(this);
}
}

创建后,后续所有活动都要继承这个类,就不需要一个个手动调用了!

最后的最后,在你想要退出的地方调用finishAll()这个方法你就可以随时退出程序

 

本文大致参考了《第一行代码》第二版,里面的第二章,不得不说这是本好的工具书!感谢作者