http://blog.csdn.net/wangjinyu501/article/details/8763552

问题描述

在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决。一般要么是一个简单的finish(只是退出当前的activity),要么是其他的方法,比如:

1、第一种方法:首先获取当前进程的id,然后杀死该进程:android.os.Process.killProcess(android.os.Process.myPid());

2、第二种方法:终止当前正在运行的Java虚拟机,导致程序终止:System.exit(0);

3、第三种方法:强制关闭与该包有关联的一切执行:ActivityManagermanager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

manager.restartPackage(getPackageName());

使用这个方法需要加入权限<uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/>

但是,这几种方法都是有缺陷的,都不能完全退出程序,比如方法一,它不会把当前应用程序的activity的task栈清空。对于第三种方法,它只能杀死其他的应用程序而不能杀死自己的。

二、解决方案

1、实现思路:既然不能一次性全部关闭所有的Activity,一般企业的解决方法就是记录所有打开的Activity,利用单例模式管理Activity,然后在退出程序的时候把所有打开的Activity关闭掉。

2、代码:

⑴新建一个类App继承Application,它的作用是创建整个应用程序的全局实例,而且需要在AndroidManifest.xml清单里面添加一下。

App类:

[html] view plain copy
  1. packagecom.example.testexit;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.app.Application;
  6. publicclassAppextendsApplication{
  7. ArrayList<Activity>activities;
  8. privatestaticAppinstance;
  9. /*
  10. *在整个应用程序创建时执行
  11. */
  12. @Override
  13. publicvoidonCreate(){
  14. activities=newArrayList<Activity>();
  15. getInstance();
  16. super.onCreate();
  17. }
  18. publicstaticAppgetInstance(){
  19. if(null==instance){
  20. instance=newApp();
  21. }
  22. returninstance;
  23. }
  24. publicvoidexitApplication(){
  25. List<Activity>lists=instance.activities;
  26. for(Activitya:lists){
  27. a.finish();
  28. }
  29. }
  30. }

在其它的Activity里面,要在onCreate方法里把当前Activity加进去,然后在onDestroy方法里移除这个Activity。

MainActivity:

[java] view plain copy
  1. packagecom.example.testexit;
  2. importandroid.os.Bundle;
  3. importandroid.app.Activity;
  4. importandroid.view.Menu;
  5. publicclassMainActivityextendsActivity{
  6. @Override
  7. protectedvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. Appapp=(App)getApplication();
  11. app.activities.add(this);
  12. }
  13. @Override
  14. publicbooleanonCreateOptionsMenu(Menumenu){
  15. getMenuInflater().inflate(R.menu.main,menu);
  16. returntrue;
  17. }
  18. @Override
  19. protectedvoidonDestroy(){
  20. super.onDestroy();
  21. Appapp=(App)getApplication();
  22. app.activities.remove(this);
  23. }
  24. }

Activity1:

[java] view plain copy
  1. packagecom.example.testexit;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. publicclassActivity1extendsActivity{
  5. @Override
  6. protectedvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. Appapp=(App)getApplication();
  9. app.activities.add(this);
  10. }
  11. @Override
  12. protectedvoidonDestroy(){
  13. super.onDestroy();
  14. Appapp=(App)getApplication();
  15. app.activities.remove(this);
  16. }
  17. }

关于这方面的内容,还可以参考其他的几篇文章http://www.2cto.com/kf/201108/99444.html

http://blog.csdn.net/sgl870927/article/details/6281971

http://www.cnblogs.com/qingblog/archive/2012/06/08/2541790.html

更多相关文章

  1. Android(安卓)Q WiFi Enable
  2. Android(安卓)内置应用截屏方法
  3. android自动化测试CTS源码分析之一
  4. 带你一步一步深入Handler源码,拿下面试官不在话下!
  5. Android(安卓)Fragment中监听事件
  6. Android(安卓)弹出式布局之Dialog源码分析
  7. HttpURLConnection 源码分析
  8. Android中SQLiteOpenHelper类的onUpgrade方法浅谈
  9. 跟着徐宜生学Android——

随机推荐

  1. Android中对Handle机制的理解
  2. Android(安卓)获得图片并解码成缩略图以
  3. Android(安卓)属性动画(Property Animati
  4. android 虚拟键盘遮挡布局 顶起布局
  5. Asynchronous HTTP Requests in Android(
  6. android UI线程向子线程发送Message
  7. Android(安卓)Scroller、VelocityTracker
  8. Android(安卓)Studio插件整理
  9. android的休眠和唤醒流程
  10. 解决TextView中MaxLines与ellipsize=end