退出Android程序时清除所有activity的实现方法
本文实例讲述了退出android程序时清除所有activity的方法。分享给大家供大家参考,具体如下:
在一个项目中,要退出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的完全退出。
更多关于android相关内容感兴趣的读者可查看本站专题:《android通信方式总结》、《android调试技巧与常见问题解决方法汇总》、《android开发入门与进阶教程》、《android多媒体操作技巧汇总(音频,视频,录音等)》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
上一篇: C和指针 十二章 双链表没有实现
下一篇: C和指针(第三章)