出处:http://blog.csdn.net/chenliguan/article/details/47295163

一、问题描述

做Android项目,退出程序时,有时不能退出所有的activity,这时我们就需要在退出时,关闭所有的activity。

二、解决方法

1.Dalvik VM的本地方法

  android.os.Process.killProcess(android.os.Process.myPid()); 
  获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。 
  System.exit(0); 
  常规java、c#的标准退出法,返回值为0代表正常退出

2.任务管理器方法

  在Android 1.5以上才可以,同时需要权限: 
  android:name=\”android.permission.RESTART_PACKAGES\”>

    ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName()); 
  • 1
  • 2

系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净。

3.根据Activity的声明周期

  我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

  在A窗口中使用下面的代码调用B窗口

   Intent intent = new Intent(); intent.setClass(Android123.this, CWJ.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置startActivity(intent);
  • 1
  • 2
  • 3
  • 4

  接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

4.自定义一个Activity 栈(通用方法)。利用一个单例模式的Activity栈来存放并管理所有Activity。并提供退出所有Activity的方法。

三、自定义一个Activity 栈方法(通用方法)详解,代码如下:


package com.example.guan.activitywork;import android.app.Activity;import java.util.LinkedList;
import java.util.List;/*** 用于处理退出程序时可以退出所有的activity,而编写的通用类* @author guan* @date 2015-8-5*/
public class ActivityManager {private List<Activity> activityList = new LinkedList<Activity>();private static ActivityManager instance;private ActivityManager() {}// 单例模式中获取唯一的MyApplication实例public static ActivityManager getInstance() {if (null == instance) {instance = new ActivityManager();}return instance;}// 添加Activity到容器中public void addActivity(Activity activity) {activityList.add(activity);}// 移除一个activitypublic void deleteActivity(Activity activity) {if (activityList != null && activityList.size() > 0) {if (activity != null) {activity.finish();activityList.remove(activity);activity = null;}}}// 遍历所有Activity并finishpublic void exit() {for (Activity activity : activityList) {activity.finish();}System.exit(0);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

或者更加全面的堆栈管理类


/*** activity堆栈管理* * @author blue*/
public class ActivityStack
{private static ActivityStack mSingleInstance;private Stack<Activity> mActicityStack;private ActivityStack(){mActicityStack = new Stack<Activity>();}public static ActivityStack getInstance(){if (null == mSingleInstance){mSingleInstance = new ActivityStack();}return mSingleInstance;}public Stack<Activity> getStack(){return mActicityStack;}/*** 入栈* * @author blue*/public void addActivity(Activity activity){mActicityStack.push(activity);}/*** 出栈* * @author blue*/public void removeActivity(Activity activity){mActicityStack.remove(activity);}/*** 彻底退出* * @author blue*/public void finishAllActivity(){Activity activity;while (!mActicityStack.empty()){activity = mActicityStack.pop();if (activity != null)activity.finish();}}/*** finish指定的activity* * @author blue*/public boolean finishActivity(Class<? extends Activity> actCls){Activity act = findActivityByClass(actCls);if (null != act && !act.isFinishing()){act.finish();return true;}return false;}public Activity findActivityByClass(Class<? extends Activity> actCls){Activity aActivity = null;Iterator<Activity> itr = mActicityStack.iterator();while (itr.hasNext()){aActivity = itr.next();if (null != aActivity && aActivity.getClass().getName().equals(actCls.getName()) && !aActivity.isFinishing()){break;}aActivity = null;}return aActivity;}/*** finish指定的activity之上的所有activity* * @author blue*/public boolean finishToActivity(Class<? extends Activity> actCls, boolean isIncludeSelf){List<Activity> buf = new ArrayList<Activity>();int size = mActicityStack.size();Activity activity = null;for (int i = size - 1; i >= 0; i--){activity = mActicityStack.get(i);if (activity.getClass().isAssignableFrom(actCls)){for (Activity a : buf){a.finish();}return true;} else if (i == size - 1 && isIncludeSelf){buf.add(activity);} else if (i != size - 1){buf.add(activity);}}return false;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130

四、使用方法

1.在onCreate()方法里面加上:

ActivityManager.getInstance().addActivity(this);
  • 1

2.在onDestroy()方法里面加上:

ActivityManager.getInstance().deleteActivity(this);
  • 1
  • 2

3.退出时调用:

ActivityManager.getInstance().exit();

Android基础之结束所有Activity通用方法相关推荐

  1. Android基础——四大组件之Activity

    这几天继续回顾了一些Android基础方面的知识,今天跟大家一起回顾下Android四大组件中的Activity.虽然很基础,但工欲善其事,必先利其器.我们只有打好夯实的基础,才能在技术开发这条道路上 ...

  2. Android基础学习第二篇—Activity

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

  3. Android Fragment跳转到Activity的方法

    一开始我直接按照Activity页面之间跳转的方法进行的跳转,就是在xml文件中给相应的组件onClick android:onClick="to_search" 在网上查询到的好 ...

  4. Android基础四大组件之Activity的启动过程源码解析

    前言 Activity是Android中一个很重要的概念,堪称四大组件之首,关于Activity有很多内容,比如生命周期和启动Flags,这二者想要说清楚,恐怕又要写两篇长文,更何况分析它们的源码呢. ...

  5. android fragment activity 交互,Android基础之Fragment与Activity交互详解

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...

  6. 转:[C#]获取某年指定周的开始日期和结束日期的通用方法

    来自:http://blog.csdn.net/vrhero/archive/2008/01/13/2042481.aspx /// <summary> /// 获取一年中指定的一周的开始 ...

  7. Android基础教程(三)之------ Activity 窗口切换

    首先在layout里建2个xml文件 分别有按钮1和按钮2 JAVA代码: 1.public class Activity01 extends Activity {  public void onCr ...

  8. Android--取得多组电话号码/Activity.startManagingCursor方法的使用

    我们知道,在添加联系人的时候,可能一个联系人不止一个号码,这时我们需要一个取得联系人多组号码的程序. 首先,需要介绍两点: 1.需要在AndroidManifest.xml文件中进行声明 <us ...

  9. Android基础新手教程——4.1.3 Activity登堂入室

    Android基础新手教程--4.1.3 Activity登堂入室 标签(空格分隔): Android基础新手教程 本节引言: 好的,在学习了两节的Activity后相信大家已经知道怎样去使用Acti ...

最新文章

  1. windows java 小程序_JAVA第一个窗体小程序
  2. 细聊一下我的3条面试标准
  3. 对实施运维的一点心得体会
  4. 流浪地球与战狼2所反映的文化心态
  5. java 包含汉字,java判断字符串中是否包含汉字
  6. java函数式编程 map_函数式编程-对Java 8流进行分区
  7. cp 过程中目录突然挂了_怎么解决管材激光切割机切管过程中出现的过烧及挂渣...
  8. 一步一步搭建mysql_Linux——搭建PHP开发环境第一步:mysql
  9. 马斯克:特斯拉FSD测试版V9将再推迟一周
  10. linux selenium_Selenium的基本使用方法
  11. 将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值,就可移动四个按钮...
  12. 能源路由器入门必读:面向能源互联网的架构和功能
  13. macbook重装系统 选择方案_Mac重装系统教程(二):网络在线重装系统
  14. lbj学习日记 03 循环和选择结构的刷题心得
  15. java的panel布局_学习面panel和三种布局
  16. centos检测不到磁盘_IBM服务器安装CentOS找不到硬盘的解决方法
  17. jshop的下载和导入
  18. matlab 高精度无理数,如何从MatLab上的无理数产生近似分数?
  19. 关于 YCbCr(YUV) 格式视频流的介绍
  20. 为什么模电这么难学?

热门文章

  1. Linux系统下删除整个文件夹
  2. 浏览器通过apache访问php文件提示下载问题,更改项目文件目录
  3. 最新的 xp sp3序列号(绝对可通过正版验证)-xp序列号
  4. 使用分页模板完成,显示上一页,下一页,第一页,最后一页,和当前第x页,共y页 。
  5. 关于ubuntu18.04ping不通网关以及外网的办法,自己总结
  6. day_08 字符编码乱码处理
  7. gis 参考信息模型: WMS WFS WCS WMTS
  8. 酒吧经营你要知道的:企业规划
  9. HTML5+CSS3构建简易的表单
  10. dedecms 标签