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类
代码如下:

view plain copy to clipboard print ?
  1. importjava.util.LinkedList;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.app.Application;
  5. publicclassExitApplicationextendsApplication {
  6. privateList activityList =newLinkedList();
  7. privatestaticExitApplication instance;
  8. privateExitApplication()
  9. {
  10. }
  11. //单例模式中获取唯一的ExitApplication实例
  12. publicstaticExitApplication getInstance()
  13. {
  14. if(null== instance)
  15. {
  16. instance =newExitApplication();
  17. }
  18. returninstance;
  19. }
  20. //添加Activity到容器中
  21. publicvoidaddActivity(Activity activity)
  22. {
  23. activityList.add(activity);
  24. }
  25. //遍历所有Activity并finish
  26. publicvoidexit()
  27. {
  28. for(Activity activity:activityList)
  29. {
  30. activity.finish();
  31. }
  32. System.exit(0);
  33. }
  34. }
view plain
  1. importjava.util.LinkedList;
  2. importjava.util.List;
  3. importandroid.app.Activity;
  4. importandroid.app.Application;
  5. publicclassExitApplicationextendsApplication{
  6. privateListactivityList=newLinkedList();
  7. privatestaticExitApplicationinstance;
  8. privateExitApplication()
  9. {
  10. }
  11. //单例模式中获取唯一的ExitApplication实例
  12. publicstaticExitApplicationgetInstance()
  13. {
  14. if(null==instance)
  15. {
  16. instance=newExitApplication();
  17. }
  18. returninstance;
  19. }
  20. //添加Activity到容器中
  21. publicvoidaddActivity(Activityactivity)
  22. {
  23. activityList.add(activity);
  24. }
  25. //遍历所有Activity并finish
  26. publicvoidexit()
  27. {
  28. for(Activityactivity:activityList)
  29. {
  30. activity.finish();
  31. }
  32. System.exit(0);
  33. }
  34. }

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

view plain copy to clipboard print ?
  1. importandroid.app.Activity;
  2. importandroid.content.Intent;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.widget.Button;
  7. publicclassIndexActivityextendsActivity {
  8. /** Called when the activity is first created. */
  9. @Override
  10. publicvoidonCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. Button next=(Button)findViewById(R.id.next_to_b);
  14. next.setOnClickListener(nextClick);
  15. Button exit=(Button)findViewById(R.id.exit_main);
  16. exit.setOnClickListener(exitClick);
  17. ExitApplication.getInstance().addActivity(this);
  18. }
  19. OnClickListener nextClick=newOnClickListener() {
  20. @Override
  21. publicvoidonClick(View v) {
  22. // TODO Auto-generated method stub
  23. Intent intent=newIntent(IndexActivity.this,BActivity.class);
  24. startActivity(intent);
  25. }
  26. };
  27. OnClickListener exitClick=newOnClickListener() {
  28. @Override
  29. publicvoidonClick(View v) {
  30. // TODO Auto-generated method stub
  31. ExitApplication.getInstance().exit();
  32. }
  33. };
  34. }
view plain
  1. importandroid.app.Activity;
  2. importandroid.content.Intent;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.widget.Button;
  7. publicclassIndexActivityextendsActivity{
  8. /**Calledwhentheactivityisfirstcreated.*/
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. Buttonnext=(Button)findViewById(R.id.next_to_b);
  14. next.setOnClickListener(nextClick);
  15. Buttonexit=(Button)findViewById(R.id.exit_main);
  16. exit.setOnClickListener(exitClick);
  17. ExitApplication.getInstance().addActivity(this);
  18. }
  19. OnClickListenernextClick=newOnClickListener(){
  20. @Override
  21. publicvoidonClick(Viewv){
  22. //TODOAuto-generatedmethodstub
  23. Intentintent=newIntent(IndexActivity.this,BActivity.class);
  24. startActivity(intent);
  25. }
  26. };
  27. OnClickListenerexitClick=newOnClickListener(){
  28. @Override
  29. publicvoidonClick(Viewv){
  30. //TODOAuto-generatedmethodstub
  31. ExitApplication.getInstance().exit();
  32. }
  33. };
  34. }

BActivity 类源代码:

view plain copy to clipboard print ?
  1. importandroid.app.Activity;
  2. importandroid.content.Intent;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.widget.Button;
  7. publicclassBActivityextendsActivity {
  8. @Override
  9. protectedvoidonCreate(Bundle savedInstanceState) {
  10. // TODO Auto-generated method stub
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.b);
  13. Button next_to_c=(Button)findViewById(R.id.next_to_c);
  14. next_to_c.setOnClickListener(next_to_cClick);
  15. Button exit_b=(Button)findViewById(R.id.exit_b);
  16. exit_b.setOnClickListener(exitClick);
  17. ExitApplication.getInstance().addActivity(this);
  18. }
  19. OnClickListener next_to_cClick=newOnClickListener() {
  20. @Override
  21. publicvoidonClick(View v) {
  22. // TODO Auto-generated method stub
  23. Intent intent=newIntent(BActivity.this,CActivity.class);
  24. startActivity(intent);
  25. }
  26. };
  27. OnClickListener exitClick=newOnClickListener() {
  28. @Override
  29. publicvoidonClick(View v) {
  30. // TODO Auto-generated method stub
  31. ExitApplication.getInstance().exit();
  32. }
  33. };
  34. }
view plain
  1. importandroid.app.Activity;
  2. importandroid.content.Intent;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.widget.Button;
  7. publicclassBActivityextendsActivity{
  8. @Override
  9. protectedvoidonCreate(BundlesavedInstanceState){
  10. //TODOAuto-generatedmethodstub
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.b);
  13. Buttonnext_to_c=(Button)findViewById(R.id.next_to_c);
  14. next_to_c.setOnClickListener(next_to_cClick);
  15. Buttonexit_b=(Button)findViewById(R.id.exit_b);
  16. exit_b.setOnClickListener(exitClick);
  17. ExitApplication.getInstance().addActivity(this);
  18. }
  19. OnClickListenernext_to_cClick=newOnClickListener(){
  20. @Override
  21. publicvoidonClick(Viewv){
  22. //TODOAuto-generatedmethodstub
  23. Intentintent=newIntent(BActivity.this,CActivity.class);
  24. startActivity(intent);
  25. }
  26. };
  27. OnClickListenerexitClick=newOnClickListener(){
  28. @Override
  29. publicvoidonClick(Viewv){
  30. //TODOAuto-generatedmethodstub
  31. ExitApplication.getInstance().exit();
  32. }
  33. };
  34. }

CActivity 类源代码:

view plain copy to clipboard print ?
  1. importandroid.app.Activity;
  2. importandroid.os.Bundle;
  3. importandroid.view.View;
  4. importandroid.view.View.OnClickListener;
  5. importandroid.widget.Button;
  6. publicclassCActivityextendsActivity{
  7. @Override
  8. protectedvoidonCreate(Bundle savedInstanceState) {
  9. // TODO Auto-generated method stub
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.c);
  12. Button exit_c=(Button)findViewById(R.id.exit_c);
  13. exit_c.setOnClickListener(exitClick);
  14. ExitApplication.getInstance().addActivity(this);
  15. }
  16. OnClickListener exitClick=newOnClickListener() {
  17. @Override
  18. publicvoidonClick(View v) {
  19. // TODO Auto-generated method stub
  20. ExitApplication.getInstance().exit();
  21. //如果只是调用以下其中的一个方法,并不会完全退出应用
  22. //android.os.Process.killProcess(android.os.Process.myPid());
  23. //System.exit(0);
  24. }
  25. };
  26. }

更多相关文章

  1. Android截屏截图的几种方法总结
  2. Ubuntu adb devices : no permissions 解决方法
  3. Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏
  4. android 源代码在线查看和索引
  5. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)
  6. Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题

随机推荐

  1. Android的NDK开发(2)-基于NDK的OpenGL开
  2. SwipeRefreshLayout 配合fragment 下拉刷
  3. Android 实现图片的自动缩放,适应分辨率不
  4. 如何让android sdk manager飞奔安装sdk
  5. activity 启动流程分析
  6. Android动画之属性动画(Property Animatio
  7. Android控件系列之ProgressBar&在Android
  8. 【开源推荐】进阶实战,从一款音乐播放器开
  9. Android实践 -- Android Support Library
  10. Android studio登录界面之记住密码