有没有清空打印activity堆栈栈底所有activity的方法

android转载分享(14)
在一个项目中,要退出android程序,试了restartPackage、 killBackgroundProcesses 、通过异常并在Application的子类中重新注册Thread的 Thread.UncaughtExceptionHandler接口+异常方式,等等,都没有效果。
最后发现其实只要在从一个activity A 跳到另一个activity B 时,调用了A的finish方法,程序就能退出,但这样不能实现Back操作了,最后想一个办法:我们为什么不自己控制程序创建的activity呢?比如我们可以把程序创建的avtivity放在一个全局变量里,在退出程序的时候取出每个还存在的activity,并对每个activity依次调用finish最后程序就正常退出了。
先做以下几点说明:
(1)我们可以重写一个Activity管理类ActivityManager,里面有一个堆栈结构,用来存放用户显示的activity,并暴露几个方法,一个向堆栈结构中加入Activity,它主要用来当新建一个Activity时加入堆栈,另外一个从堆栈结构中取出一个Activity,当用户调用Back按键时,要从堆栈中删除无用的activity,最后定义一个系统退出时清空activity方法,并在清空Activity时调用每个Activity的finish方法完成内存资源的释放。
(2)为了共享复杂的数据类型,我们可以采用重写Application类的方法,在这个类里面定义一个成员---Activity管理类ActivityManager,这样它就可以被所有的Activity共享了。
(3)在适当的时候我们调用ActivityManager的入堆栈操作和出堆栈操作就行了。比如,在我的需求里,我在onCreate时调用入堆栈操作,在用户进行点击Back按键时进行出堆栈操作。
(4)为了减少代码的重复性,我们可以在实际操作时,自定义一个Activity基类,重写里面的onCreate()方法和onBackPressed方法,onCreate方法里我们把当前的Activity放入自定义ActivityManager,onBackPressed我们将当前Activity从ActivityManager中弹出。
先看ActivityManager类主要代码。
import java.util.S
public class ActivityManager {
private static Stack&Activity& activityS
private static ActivityM
private ActivityManager() {
public static ActivityManager getScreenManager() {
if (instance == null) {
instance = new ActivityManager();
//退出栈顶Activity
public void popActivity(Activity activity) {
if (activity != null) {
//在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作
activity.finish();
activityStack.remove(activity);
activity =
//获得当前栈顶Activity
public Activity currentActivity() {
Activity activity =
if(!activityStack.empty())
activity= activityStack.lastElement();
//将当前Activity推入栈中
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack&Activity&();
activityStack.add(activity);
//退出栈中所有Activity
public void popAllActivityExceptOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
if (activity.getClass().equals(cls)) {
popActivity(activity);
再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。
public class ApplicationEx extends Application {
private static final String TAG = &ApplicationEx&;
private HttpClient httpC //采用apache网络连接组件
private ActivityManager activityManager =
public ApplicationEx() {
public ActivityManager getActivityManager() {
return activityM
public void setActivityManager(ActivityManager activityManager) {
this.activityManager = activityM
public void onCreate() {
super.onCreate();
httpClient = createHttpClient();
//初始化自定义Activity管理器
activityManager = ActivityManager.getScreenManager();
public void onLowMemory() {
super.onLowMemory();
shutdownHttpClient();
public void onTerminate() {
super.onTerminate();
shutdownHttpClient();
private void shutdownHttpClient() {
if (httpClient != null && httpClient.getConnectionManager() != null) {
httpClient.getConnectionManager().shutdown();
private HttpClient createHttpClient() {
Log.d(TAG, &createHttpClient()...&);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme(&http&, PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme(&https&, SSLSocketFactory.getSocketFactory(), 443));
//解决多线程访问安全问题
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(connectionManager, params);
public HttpClient getHttpClient() {
if (httpClient != null) {
return httpC
return createHttpClient();
再看看我们自定义的一个Acitivity基类。
public abstract class AbstractTemplateActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ApplicationEx application = (ApplicationEx) this.getApplication();
application.getActivityManager().pushActivity(this);
public void onBackPressed() {
super.onBackPressed();
ApplicationEx application = (ApplicationEx) getApplication();
application.getActivityManager().popActivity(this);
这样只我们的Activity都继承AbstractTemplateActivity ,我们就不需要在每个Activity中写
ApplicationEx application = (ApplicationEx) this.getApplication();
application.getActivityManager().pushActivity(this); 等相关代码了。
在android 2.1以上的版本都能实现Activity的完全退出
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46881次
排名:千里之外
原创:36篇
转载:29篇
评论:14条
(2)(1)(1)(1)(1)(2)(2)(1)(3)(2)(1)(3)(1)(1)(1)(9)(4)(9)(1)(10)(9)3723人阅读
技术转载(16)
在一个项目中,要退出android程序,试了restartPackage、 killBackgroundProcesses 、通过异常并在Application的子类中重新注册Thread的 Thread.UncaughtExceptionHandler接口+异常方式,等等,都没有效果。
最后发现其实只要在从一个activity A 跳到另一个activity B 时,调用了A的finish方法,程序就能退出,但这样不能实现Back操作了,最后想一个办法:我们为什么不自己控制程序创建的activity呢?比如我们可以把程序创建的avtivity放在一个全局变量里,在退出程序的时候取出每个还存在的activity,并对每个activity依次调用finish最后程序就正常退出了。
先做以下几点说明:
(1)我们可以重写一个Activity管理类ActivityManager,里面有一个堆栈结构,用来存放用户显示的activity,并暴露几个方法,一个向堆栈结构中加入Activity,它主要用来当新建一个Activity时加入堆栈,另外一个从堆栈结构中取出一个Activity,当用户调用Back按键时,要从堆栈中删除无用的activity,最后定义一个系统退出时清空activity方法,并在清空Activity时调用每个Activity的finish方法完成内存资源的释放。
(2)为了共享复杂的数据类型,我们可以采用重写Application类的方法,在这个类里面定义一个成员---Activity管理类ActivityManager,这样它就可以被所有的Activity共享了。
(3)在适当的时候我们调用ActivityManager的入堆栈操作和出堆栈操作就行了。比如,在我的需求里,我在onCreate时调用入堆栈操作,在用户进行点击Back按键时进行出堆栈操作。
(4)为了减少代码的重复性,我们可以在实际操作时,自定义一个Activity基类,重写里面的onCreate()方法和onBackPressed方法,onCreate方法里我们把当前的Activity放入自定义ActivityManager,onBackPressed我们将当前Activity从ActivityManager中弹出。
先看ActivityManager类主要代码。
import java.util.S
public class ActivityManager {
private static Stack&Activity& activityS
private static ActivityM
private ActivityManager() {
public static ActivityManager getScreenManager() {
if (instance == null) {
instance = new ActivityManager();
//退出栈顶Activity
public void popActivity(Activity activity) {
if (activity != null) {
//在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作
activity.finish();
activityStack.remove(activity);
activity =
//获得当前栈顶Activity
public Activity currentActivity() {
Activity activity =
if(!activityStack.empty())
activity= activityStack.lastElement();
//将当前Activity推入栈中
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack&Activity&();
activityStack.add(activity);
//退出栈中所有Activity
public void popAllActivityExceptOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
if (activity.getClass().equals(cls)) {
popActivity(activity);
再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。
public class ApplicationEx extends Application {
private static final String TAG = &ApplicationEx&;
private HttpClient httpC //采用apache网络连接组件
private ActivityManager activityManager =
public ApplicationEx() {
public ActivityManager getActivityManager() {
return activityM
public void setActivityManager(ActivityManager activityManager) {
this.activityManager = activityM
public void onCreate() {
super.onCreate();
httpClient = createHttpClient();
//初始化自定义Activity管理器
activityManager = ActivityManager.getScreenManager();
public void onLowMemory() {
super.onLowMemory();
shutdownHttpClient();
public void onTerminate() {
super.onTerminate();
shutdownHttpClient();
private void shutdownHttpClient() {
if (httpClient != null && httpClient.getConnectionManager() != null) {
httpClient.getConnectionManager().shutdown();
private HttpClient createHttpClient() {
Log.d(TAG, &createHttpClient()...&);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme(&http&, PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme(&https&, SSLSocketFactory.getSocketFactory(), 443));
//解决多线程访问安全问题
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(connectionManager, params);
public HttpClient getHttpClient() {
if (httpClient != null) {
return httpC
return createHttpClient();
再看看我们自定义的一个Acitivity基类。
public abstract class AbstractTemplateActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ApplicationEx application = (ApplicationEx) this.getApplication();
application.getActivityManager().pushActivity(this);
public void onBackPressed() {
super.onBackPressed();
ApplicationEx application = (ApplicationEx) getApplication();
application.getActivityManager().popActivity(this);
这样只我们的Activity都继承AbstractTemplateActivity ,我们就不需要在每个Activity中写&&& ApplicationEx application = (ApplicationEx) this.getApplication();&&&&&& application.getActivityManager().pushActivity(this); 等相关代码了。
在android 2.1以上的版本都能实现Activity的完全退出。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230115次
积分:2757
积分:2757
排名:第9657名
原创:47篇
转载:20篇
评论:125条
(1)(1)(4)(7)(5)(6)(2)(7)(13)(21)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&如何杀掉本应用在堆栈中的所有activity,而不杀掉本应用的服务?
[问题点数:40分,结帖人flying_vip_521]
如何杀掉本应用在堆栈中的所有activity,而不杀掉本应用的服务?
[问题点数:40分,结帖人flying_vip_521]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。android&退出activity&的方式总结
在android中使用:[activityname].this.finish();&
只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用:
使用killProcess()函数,首先获取当前进程的id,然后杀死该进程:
android.os.Process.killProcess(android.os.Process.myPid());
通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空
在activity的生命周期函数中添加如下的函数,强制关闭与该包有关联的一切执行:
ActivityManager&am&=&(ActivityManager)getSystemService&(Context.ACTIVITY_SERVICE);&
am.restartPackage("packagename");&
还需要在AndroidManifest.xml文件中加入如下的权限:&uses-permission&android:name="android.permission.RESTART_PACKAGES"&/&
此做法:只能杀死别人,不能杀死自己
三、 终止当前正在运行的Java虚拟机,导致程序终止
System.exit(0);
不会把自己的应用程序杀死
企业中做法:
创建类app 继承Application
AndroidMainfest --&name --&app
//声明该类为整个应用程序全局的实例
创建整个应用程序全局的实例
App.class:
ArrayList&Activity&
其他的Activity中:
public void onCreate(Bundle savedInstanceState) {
App app = (App) getApplication();//获取应用程序全局的实例引用
app.activities.add(this);&&&
//把当前Activity放入集合中
public void onDestory(){
App app = (App) getApplication();//获取应用程序全局的实例引用
app.activities.remove(this); //把当前Activity从集合中移除
安全退出:
在菜单退出按钮的事件中定义如下代码:
App app = (App) getApplication();
List&Activity& activities =
for(Activity act:activities){
& act.finish();//显式结束
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 android activity堆栈 的文章

 

随机推荐