android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C三个Activity,而想在B或C中Activity退出,调用上面的方法,往往会销毁当前的Activity返回上一个Activity。当然也可以逐个返回上一个Activity,直到跳转到入口的Activity,最后退出应用程序。但这样比较麻烦,而且逐个返回的体验并不友好。
我常用的一种方法是自己定义一个类似Activity栈的东西(我用的是LinkedList<Activity>),把每一个Activity执行oncreate()的时候都加入到这个list,当要完全退出的时候就遍历这个list,循环删除。
代码如下:
package com.tarena.exit.model; import java.util.LinkedList; import android.app.Activity; import android.os.Bundle; public class BaseActivity extends Activity { public static LinkedList<Activity> allActivitys = new LinkedList<Activity>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); allActivitys.add(this); } @Override protected void onDestroy() { super.onDestroy(); allActivitys.remove(this); } public static void finishAll(){ for (Activity activity : allActivitys) { activity.finish(); } allActivitys.clear(); //这个主要是用来关闭进程的, 光把所有activity finish的话,进程是不会关闭的 System.exit(0); // android.os.Process.killProcess(android.os.Process.myPid()); } }
以后每写一个Activity就让它extends BaseActivity 即可。如果需要完全退出,调用 BaseActivity.finishAll();即可。
这个写法有个局限。因为java中类是单继承。如果一个Activity需要extends TabActivity ,那它就不能继承BaseActivity了。
下面看另一种方法:原理和之上的方法差不多。
package com.tarena.exit.model; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.Application; public class ExitApplication extends Application { private List<Activity> activityList = new LinkedList<Activity>(); private static ExitApplication instance; private ExitApplication() { // 单例模式中获取唯一的ExitApplication实例 } public static ExitApplication getInstance() { if (null == instance) { instance = new ExitApplication(); } return instance; } // 添加Activity到容器中 public void addActivity(Activity activity) { activityList.add(activity); } public void exit() { // 遍历所有Activity并finish() for (Activity activity : activityList) { activity.finish(); } System.exit(0); } }