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

 更新时间:2016年04月12日 08:47:31   作者:段残梦  
这篇文章主要介绍了退出Android程序时清除所有activity的实现方法,详细分析了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程序设计有所帮助。

相关文章

  • Flutter实现底部弹窗效果

    Flutter实现底部弹窗效果

    本文详细讲解了Flutter实现底部弹窗效果的方法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • 基于fluttertoast实现封装弹框提示工具类

    基于fluttertoast实现封装弹框提示工具类

    这篇文章主要为大家介绍了基于fluttertoast实现封装弹框提示工具类的实现代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 浅析Android App的相对布局RelativeLayout

    浅析Android App的相对布局RelativeLayout

    这篇文章主要介绍了Android App的相对布局RelativeLayout,文中举了一个登录界面的XML布局例子,非常直观,需要的朋友可以参考下
    2016-04-04
  • Android开发之利用jsoup解析HTML页面的方法

    Android开发之利用jsoup解析HTML页面的方法

    这篇文章主要介绍了Android开发之利用jsoup解析HTML页面的方法,结合实例形式分析了Android基于jsoup jar包来抓取html页面的实现技巧,需要的朋友可以参考下
    2016-03-03
  • 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸

    通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸

    当开发基于软件模式的游戏时,通过缩放视频缓冲区来适应显示尺寸是最棘手的问题之一;作为开发人员,我们必须尝试在性能与显示质量之间找到最佳平衡点
    2012-12-12
  • Android实现ListView异步加载的方法(改进版)

    Android实现ListView异步加载的方法(改进版)

    这篇文章主要介绍了Android实现ListView异步加载的方法,针对前面介绍的方法进行了线程操作的改进,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • Android开发之经典游戏贪吃蛇

    Android开发之经典游戏贪吃蛇

    贪吃蛇是一款足够经典的游戏。它的经典,在于用户操作的简单,在于技术实现的简介,在于他的经久不衰。下面来看下如何在Android开发这款经典游戏。
    2016-07-07
  • Android调用系统自带的分享功能实例代码

    Android调用系统自带的分享功能实例代码

    本篇文章主要介绍了Android调用系统自带的分享功能实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Android中选项菜单(OptionMenu)的创建方法

    Android中选项菜单(OptionMenu)的创建方法

    这篇文章主要介绍了Android中选项菜单(OptionMenu)的创建方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Android短信验证码自动填充功能

    Android短信验证码自动填充功能

    点击获取验证码按钮,收到短信,当前应用不需要退出程序就可以获取到短信中的验证码,并自动填充,这篇文章主要介绍了Android短信验证码自动填充功能,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论