欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

退出Android程序时清除所有activity的实现方法

程序员文章站 2024-02-29 17:26:58
本文实例讲述了退出android程序时清除所有activity的方法。分享给大家供大家参考,具体如下: 在一个项目中,要退出android程序,试了restartpack...

本文实例讲述了退出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程序设计有所帮助。