Android基础之结束所有Activity通用方法
出处: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通用方法相关推荐
- Android基础——四大组件之Activity
这几天继续回顾了一些Android基础方面的知识,今天跟大家一起回顾下Android四大组件中的Activity.虽然很基础,但工欲善其事,必先利其器.我们只有打好夯实的基础,才能在技术开发这条道路上 ...
- Android基础学习第二篇—Activity
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- Android Fragment跳转到Activity的方法
一开始我直接按照Activity页面之间跳转的方法进行的跳转,就是在xml文件中给相应的组件onClick android:onClick="to_search" 在网上查询到的好 ...
- Android基础四大组件之Activity的启动过程源码解析
前言 Activity是Android中一个很重要的概念,堪称四大组件之首,关于Activity有很多内容,比如生命周期和启动Flags,这二者想要说清楚,恐怕又要写两篇长文,更何况分析它们的源码呢. ...
- android fragment activity 交互,Android基础之Fragment与Activity交互详解
今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...
- 转:[C#]获取某年指定周的开始日期和结束日期的通用方法
来自:http://blog.csdn.net/vrhero/archive/2008/01/13/2042481.aspx /// <summary> /// 获取一年中指定的一周的开始 ...
- Android基础教程(三)之------ Activity 窗口切换
首先在layout里建2个xml文件 分别有按钮1和按钮2 JAVA代码: 1.public class Activity01 extends Activity { public void onCr ...
- Android--取得多组电话号码/Activity.startManagingCursor方法的使用
我们知道,在添加联系人的时候,可能一个联系人不止一个号码,这时我们需要一个取得联系人多组号码的程序. 首先,需要介绍两点: 1.需要在AndroidManifest.xml文件中进行声明 <us ...
- Android基础新手教程——4.1.3 Activity登堂入室
Android基础新手教程--4.1.3 Activity登堂入室 标签(空格分隔): Android基础新手教程 本节引言: 好的,在学习了两节的Activity后相信大家已经知道怎样去使用Acti ...
最新文章
- windows java 小程序_JAVA第一个窗体小程序
- 细聊一下我的3条面试标准
- 对实施运维的一点心得体会
- 流浪地球与战狼2所反映的文化心态
- java 包含汉字,java判断字符串中是否包含汉字
- java函数式编程 map_函数式编程-对Java 8流进行分区
- cp 过程中目录突然挂了_怎么解决管材激光切割机切管过程中出现的过烧及挂渣...
- 一步一步搭建mysql_Linux——搭建PHP开发环境第一步:mysql
- 马斯克:特斯拉FSD测试版V9将再推迟一周
- linux selenium_Selenium的基本使用方法
- 将四个按钮放入一个父控件的好处:方便移动,只需要改变父控件的y值,就可移动四个按钮...
- 能源路由器入门必读:面向能源互联网的架构和功能
- macbook重装系统 选择方案_Mac重装系统教程(二):网络在线重装系统
- lbj学习日记 03 循环和选择结构的刷题心得
- java的panel布局_学习面panel和三种布局
- centos检测不到磁盘_IBM服务器安装CentOS找不到硬盘的解决方法
- jshop的下载和导入
- matlab 高精度无理数,如何从MatLab上的无理数产生近似分数?
- 关于 YCbCr(YUV) 格式视频流的介绍
- 为什么模电这么难学?