我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

退出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程序设计有所帮助。

您可能感兴趣的文章:Android使用Theme自定义Activity进入退出动画的方法Android仿微信滑动退出ActivityAndroid 中 退出多个activity的经典方法Android一次性退出多个Activity的方法android中实现完全退出程序方法(退出所有activity)Android Activity进出动画三种方法Android Activity切换动画详解及实例Android Activity跳转动画效果Android实现Activity界面切换添加动画特效的方法Android的Activity跳转动画各种效果整理Android编程设定activity进入和退出效果的方法


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本文实例讲述了退出Android程序时清除所有activity的方法。分享给大家供大家参考,具体如下: 在一个项目中,要退出android程序,试了restartPackage、 killBackgroundProcesses 、通过异常并
2022-06-06

android中实现完全退出程序方法(退出所有activity)

这是一个很多很多人都 会遇到的问题,我也试过了很多方法,都不怎么好用。 比如:代码如下: System.exit(0);不行。 还有什么跳转到第一个activity,同时把栈顶的activity全部清除,最后再finish();还是不行。。
2022-06-06

Android实现退出时关闭所有Activity的方法

本文示例实现了Android退出时关闭所有Activity的功能,分享给大家供大家参考之用。具体方法如下: 一般来说,在Android退出时,有的Activity可能没有被关闭。为了在Android退出时关闭所有的Activity,这里给出
2022-06-06

Android 按后退键退出Android程序的实现方法

主要目的是按后退键的时候,让程序能够退出。 实现起来的思路: 1.捕获到后退键事件就触发。 代码如下:@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
2022-06-06

Android 退出应用程序的实现方法

Android 退出应用程序的实现方法 android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0)
2022-06-06

SpringBoot Redis清除所有的key的实现方法

本文主要介绍了SpringBoot Redis清除所有的key的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-18

Android 再按一次退出程序的实现方法

第一种(Handler+标志位) 代码如下:private boolean isExit; private Handler handler; @Override protected void onCreate(Bundle
2022-06-06

Android双击返回键退出程序的实现方法

本文实例讲述了Android双击返回键退出程序的实现方法,是Android程序开发中一个非常实用的功能,分享给大家供大家参考之用。具体方法如下: 一、实现思路: 用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返
2022-06-06

Android实现长按back键退出应用程序的方法

本文实例讲述了Android实现长按back键退出应用程序的方法。分享给大家供大家参考。具体分析如下: 最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大
2022-06-06

Android编程中activity启动时出现白屏、黑屏问题的解决方法

本文实例讲述了Android编程中activity启动时出现白屏、黑屏问题的解决方法。分享给大家供大家参考,具体如下: 默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白
2022-06-06

android编程开发之全屏和退出全屏的实现方法

本文实例讲述了android编程开发之全屏和退出全屏的实现方法。分享给大家供大家参考,具体如下: xml代码:2022-06-06

Android程序启动时出现黑屏问题的解决方法

本文实例讲述了Android程序启动时出现黑屏问题的解决方法。分享给大家供大家参考,具体如下: 关于黑屏: 默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据、向服务器发送请求获取数
2022-06-06

Android编程实现捕获程序异常退出时的错误log信息功能详解

本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能。分享给大家供大家参考,具体如下:很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误log来查看是什么原因引起的程序崩溃。但是
2023-05-30

Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法

本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法。分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orie
2022-06-06

Android如何实现读取SD卡下所有TXT文件名并用listView显示出来的方法

这篇文章将为大家详细讲解有关Android如何实现读取SD卡下所有TXT文件名并用listView显示出来的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:MainActivity.Javap
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录