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,最后退出应用程序。但这样比较麻烦,而且逐个返回的体验并不友好。

网上比较流行的方法是定义栈,写一个ExitApplication类,利用单例模式管理Activity,在每个在Activity的onCreate()方法中调用ExitApplication.getInstance().addActivity(this)方法,在退出时调用ExitApplication.getInstance().exit()方法,就可以完全退出应用程序了。

ExitApplication类

代码如下:

 


  1. import java.util.LinkedList;  
  2. import java.util.List;  
  3.   
  4. import android.app.Activity;  
  5. import android.app.Application;  
  6.   
  7. public class ExitApplication extends Application {  
  8.   
  9.     private List activityList = new LinkedList();  
  10.     private static ExitApplication instance;  
  11.   
  12.     private ExitApplication()  
  13.     {  
  14.     }  
  15.     //单例模式中获取唯一的ExitApplication实例  
  16.     public static ExitApplication getInstance()  
  17.     {  
  18.     if(null == instance)  
  19.     {  
  20.     instance = new ExitApplication();  
  21.     }  
  22.     return instance;   
  23.   
  24.     }  
  25.     //添加Activity到容器中  
  26.     public void addActivity(Activity activity)  
  27.     {  
  28.     activityList.add(activity);  
  29.     }  
  30.     //遍历所有Activity并finish  
  31.   
  32.     public void exit()  
  33.     {  
  34.   
  35.     for(Activity activity:activityList)  
  36.     {  
  37.     activity.finish();  
  38.     }  
  39.   
  40.     System.exit(0);  
  41.   
  42.     }  
  43.     }  


下面的三个类IndexActivity, BActivity,CActivity是简单的例子,分别是IndexActivity–>BActivity–>CActivity的跳转顺序。在每个Activity类中onCreate()方法中调用ExitApplication.getInstance().addActivity(Activity activity)方法。在任何一个Activity界面退出应用程序时,只要调用ExitApplication.getInstance().exit()方法,就可以在任何一个Activity中完全退出应用程序。

IndexActivity 类源代码:


  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. public class IndexActivity extends Activity {  
  9.     /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         Button next=(Button)findViewById(R.id.next_to_b);  
  16.         next.setOnClickListener(nextClick);  
  17.   
  18.         Button exit=(Button)findViewById(R.id.exit_main);  
  19.         exit.setOnClickListener(exitClick);  
  20.         ExitApplication.getInstance().addActivity(this);  
  21.   
  22.     }  
  23.   
  24.     OnClickListener nextClick=new OnClickListener() {  
  25.   
  26.         @Override  
  27.         public void onClick(View v) {  
  28.             // TODO Auto-generated method stub  
  29.   
  30.             Intent intent=new Intent(IndexActivity.this,BActivity.class);  
  31.             startActivity(intent);  
  32.   
  33.         }  
  34.     };  
  35.   
  36.     OnClickListener exitClick=new OnClickListener() {  
  37.   
  38.         @Override  
  39.         public void onClick(View v) {  
  40.             // TODO Auto-generated method stub  
  41.             ExitApplication.getInstance().exit();  
  42.         }  
  43.     };  
  44. }  


BActivity 类源代码:



  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. public class BActivity extends Activity {  
  9.   
  10. @Override  
  11. protected void onCreate(Bundle savedInstanceState) {  
  12. // TODO Auto-generated method stub  
  13. super.onCreate(savedInstanceState);  
  14.   
  15. setContentView(R.layout.b);  
  16. Button next_to_c=(Button)findViewById(R.id.next_to_c);  
  17. next_to_c.setOnClickListener(next_to_cClick);  
  18.   
  19. Button exit_b=(Button)findViewById(R.id.exit_b);  
  20. exit_b.setOnClickListener(exitClick);  
  21. ExitApplication.getInstance().addActivity(this);  
  22.   
  23. }  
  24.   
  25. OnClickListener next_to_cClick=new OnClickListener() {  
  26.   
  27. @Override  
  28. public void onClick(View v) {  
  29. // TODO Auto-generated method stub  
  30.   
  31. Intent intent=new Intent(BActivity.this,CActivity.class);  
  32. startActivity(intent);  
  33.   
  34. }  
  35. };  
  36.   
  37. OnClickListener exitClick=new OnClickListener() {  
  38.   
  39. @Override  
  40. public void onClick(View v) {  
  41. // TODO Auto-generated method stub  
  42. ExitApplication.getInstance().exit();  
  43. }  
  44. };  
  45. }  


CActivity 类源代码:


  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.view.View.OnClickListener;  
  5. import android.widget.Button;  
  6.   
  7. public class CActivity extends Activity{  
  8.   
  9. @Override  
  10. protected void onCreate(Bundle savedInstanceState) {  
  11. // TODO Auto-generated method stub  
  12. super.onCreate(savedInstanceState);  
  13.   
  14. setContentView(R.layout.c);  
  15.   
  16. Button exit_c=(Button)findViewById(R.id.exit_c);  
  17. exit_c.setOnClickListener(exitClick);  
  18. ExitApplication.getInstance().addActivity(this);  
  19.   
  20. }  
  21.   
  22. OnClickListener exitClick=new OnClickListener() {  
  23.   
  24. @Override  
  25. public void onClick(View v) {  
  26. // TODO Auto-generated method stub  
  27. ExitApplication.getInstance().exit();  
  28. //如果只是调用以下其中的一个方法,并不会完全退出应用  
  29. //android.os.Process.killProcess(android.os.Process.myPid());  
  30. //System.exit(0);  
  31. }  
  32. };  
  33.   
  34. }