博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
技术转载:退出android程序清除所有activity
阅读量:7091 次
发布时间:2019-06-28

本文共 4549 字,大约阅读时间需要 15 分钟。

 转自:

 

在一个项目中,要退出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.Stack; public class ActivityManager { private static Stack<Activity> activityStack; private static ActivityManager instance; private ActivityManager() { } public static ActivityManager getScreenManager() { if (instance == null) { instance = new ActivityManager(); } return instance; } //退出栈顶Activity public void popActivity(Activity activity) { if (activity != null) { //在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作 activity.finish(); activityStack.remove(activity); activity = null; } } //获得当前栈顶Activity public Activity currentActivity() { Activity activity = null; if(!activityStack.empty()) activity= activityStack.lastElement(); return activity; } //将当前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) { break; } if (activity.getClass().equals(cls)) { break; } popActivity(activity); } } }

再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。

public class ApplicationEx extends Application { private static final String TAG = "ApplicationEx"; private HttpClient httpClient; //采用apache网络连接组件 private ActivityManager activityManager = null; public ApplicationEx() { } public ActivityManager getActivityManager() { return activityManager; } public void setActivityManager(ActivityManager activityManager) { this.activityManager = activityManager; } @Override public void onCreate() { super.onCreate(); httpClient = createHttpClient(); //初始化自定义Activity管理器 activityManager = ActivityManager.getScreenManager(); } @Override public void onLowMemory() { super.onLowMemory(); shutdownHttpClient(); } @Override 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 httpClient; } else { 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); } @Override 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的完全退出。
原文链接:

转载于:https://www.cnblogs.com/duancanmeng/archive/2012/03/08/2524630.html

你可能感兴趣的文章
[nio]dawn的基本概念
查看>>
【数据库摘要】6_Sql_Inner_Join
查看>>
交叉熵代价函数(损失函数)及其求导推导
查看>>
Android UI开源框架
查看>>
Java 构造时成员初始化的陷阱
查看>>
CentOS7.1 Liberty云平台之环境准备(2)
查看>>
js正则表达式test方法、exec方法与字符串search方法区别
查看>>
4.终端
查看>>
Vue webpack配置文件
查看>>
[k8s]docker calico网络&docker cluster-store
查看>>
kerberos认证原理---讲的非常细致,易懂
查看>>
cf1042F. Leaf Sets(贪心)
查看>>
优秀的 Spring Cloud 开源软件
查看>>
[LeetCode] Design HashSet 设计HashSet
查看>>
一个字等于多少字节?
查看>>
Redis3:持久化
查看>>
Velocity 语法(转)
查看>>
利用cmd命令创建wifi热点
查看>>
Win7 下面查看当前端口对应的进程名字(XP同样适用)
查看>>
linux下网卡配置
查看>>