退出Android程序时清除所有activity的实现方法
本文实例讲述了退出Android程序时清除所有activity的方法。分享给大家供大家参考,具体如下:
在一个项目中,要退出android程序,试了restartPackage、killBackgroundProcesses、通过异常并在Application的子类中重新注册Thread的Thread.UncaughtExceptionHandler接口+异常方式,等等,都没有效果。
最后发现其实只要在从一个activityA跳到另一个activityB时,调用了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类主要代码。
importjava.util.Stack;
publicclassActivityManager{
privatestaticStack<Activity>activityStack;
privatestaticActivityManagerinstance;
privateActivityManager(){
}
publicstaticActivityManagergetScreenManager(){
if(instance==null){
instance=newActivityManager();
}
returninstance;
}
//退出栈顶Activity
publicvoidpopActivity(Activityactivity){
if(activity!=null){
//在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作
activity.finish();
activityStack.remove(activity);
activity=null;
}
}
//获得当前栈顶Activity
publicActivitycurrentActivity(){
Activityactivity=null;
if(!activityStack.empty())
activity=activityStack.lastElement();
returnactivity;
}
//将当前Activity推入栈中
publicvoidpushActivity(Activityactivity){
if(activityStack==null){
activityStack=newStack<Activity>();
}
activityStack.add(activity);
}
//退出栈中所有Activity
publicvoidpopAllActivityExceptOne(Classcls){
while(true){
Activityactivity=currentActivity();
if(activity==null){
break;
}
if(activity.getClass().equals(cls)){
break;
}
popActivity(activity);
}
}
}
再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。
publicclassApplicationExextendsApplication{
privatestaticfinalStringTAG="ApplicationEx";
privateHttpClienthttpClient;//采用apache网络连接组件
privateActivityManageractivityManager=null;
publicApplicationEx(){
}
publicActivityManagergetActivityManager(){
returnactivityManager;
}
publicvoidsetActivityManager(ActivityManageractivityManager){
this.activityManager=activityManager;
}
@Override
publicvoidonCreate(){
super.onCreate();
httpClient=createHttpClient();
//初始化自定义Activity管理器
activityManager=ActivityManager.getScreenManager();
}
@Override
publicvoidonLowMemory(){
super.onLowMemory();
shutdownHttpClient();
}
@Override
publicvoidonTerminate(){
super.onTerminate();
shutdownHttpClient();
}
privatevoidshutdownHttpClient(){
if(httpClient!=null&&httpClient.getConnectionManager()!=null){
httpClient.getConnectionManager().shutdown();
}
}
privateHttpClientcreateHttpClient(){
Log.d(TAG,"createHttpClient()...");
HttpParamsparams=newBasicHttpParams();
HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params,true);
SchemeRegistryschReg=newSchemeRegistry();
schReg.register(newScheme("http",PlainSocketFactory.getSocketFactory(),80));
schReg.register(newScheme("https",SSLSocketFactory.getSocketFactory(),443));
//解决多线程访问安全问题
ClientConnectionManagerconnectionManager=newThreadSafeClientConnManager(params,schReg);
returnnewDefaultHttpClient(connectionManager,params);
}
publicHttpClientgetHttpClient(){
if(httpClient!=null){
returnhttpClient;
}else{
returncreateHttpClient();
}
}
}
再看看我们自定义的一个Acitivity基类。
publicabstractclassAbstractTemplateActivityextendsActivity{
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
ApplicationExapplication=(ApplicationEx)this.getApplication();
application.getActivityManager().pushActivity(this);
}
@Override
publicvoidonBackPressed(){
super.onBackPressed();
ApplicationExapplication=(ApplicationEx)getApplication();
application.getActivityManager().popActivity(this);
}
}
这样只我们的Activity都继承AbstractTemplateActivity,我们就不需要在每个Activity中写 ApplicationExapplication=(ApplicationEx)this.getApplication(); application.getActivityManager().pushActivity(this);等相关代码了。
在android2.1以上的版本都能实现Activity的完全退出。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。