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());
- }
- }
- 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);
- }
- }
- 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);
- }
- }