`

退出程序时尚未finish的activity出现问题

阅读更多

 

最近在做一个android的项目,我主要负责服务器。这段时间不忙,就帮他们解决一些前台的技术问题。

刚刚就解决了一个问题,在退出应用后,所有尚未finishactivity都会依次弹出,这样显然是不合理的。

网上查了一些资料,根据项目实际情况,解决了此问题,下面把发放记在这里,大家如果发现有什么问题欢迎指教,相互交流才能共同进步。

解决这个问题要充分理解activity的生命周期。这个对一些新手如我来说是很重要的。下面贴出生命周期图。

 


   

我的解决方法就是重写每个activityonResart()方法,在里面将当前界面finish()掉。这样做的原因是onResart()只会在activityonStop转到onStart()中时才会调用,具体来说就是当你新生成一个activity时,你的调用流程是onCreate()->onStart()->onResume(),到了onResume()你的activity就可见了;当你从这个方法离开,但并没有finish这个方法,以后你再进入的时候,你的调用流程是onRestar()->onStart()->onResume();写到这里大家应该发现了,我只要在onRestart()里面放依据finish(),那么在我退出了整个android程序的时候,就会finish掉所有我尚未finish掉的activity,而且在程序运行的时候不会把我刚刚生成的activityfinish掉(因为新生成的会调用onCreate,不会调用onRestart,源代码如下:

 

    protected void onRestart()
    {
        super.onRestart();
        finish();
    }
 

 

大家应该发现了这个方法的弊端,那就是当你在程序运行的时候,想回到一个你之前离开时没有finish的界面,这个界面会被finish掉(因为调用了onRestart())。这个问题的解决方案就是在系统内部设置一个全局变量exit,当程序运行时exit=false,而当程序退出时修改exit=true。每当你进入一个没有finishactivity时,在onRestart()中判断一下exit的值,如果exit=false则不调用finishexit=true调用finish。这样当程序运行时不会将这些activityfinish掉,而一旦你退出程序,exit=true,后续出现的activity就会被finish掉,下面是源代码:

全局变量代码,这个地方我用的一个类的静态成员:

 

public class Helper {
    public static boolean exit = false;
}
 

 

onRestart()中的判断:

 

    protected void onRestart()
    {
        super.onRestart();
        if(Helper.exit)
        {
            finish();
        }  
    }
 

 

此处还有一点要格外注意,当你进入的程序的第一个activity时(也就是你每一次进入程序的时候),一定要在onCreate中加一句Helper.exit=false(我建议放在onCreate的第一句)。因为在JAVA中,类的静态成员的释放是由JAVA虚拟机来操作的,也就是说,当你退出你的程序的时候,exit不会被释放掉,这样当在JAVA虚拟机还没有释放掉exit的时候,你再进入程序,exit的值是你上次最后设置的true,这会出现什么问题?看看我们上面的介绍,对,你的程序无法返回到那些尚未finish而你又想进入的activity(因为这个时候exit=true,详细看第一部分代码和第二部分代码之间那段)。

 

写到这里目前的解决方案就都写完了,有什么错误或者存在什么隐患,欢迎大家指教。

新人第一篇博客,多谢大家支持。

 

 

1
1
分享到:
评论
2 楼 u013258199 2015-09-09  
亲测可用
1 楼 u013258199 2015-09-09  

相关推荐

    关闭所有当前运行程序所有的Activity

    例如,当用户点击应用内的“退出”按钮时,开发者可能希望关闭所有正在运行的Activity,而不是仅仅关闭当前Activity。 #### 关键概念 1. **Activity**:Activity是Android四大组件之一,代表了一个屏幕界面。每个...

    android面试题和答案

    - **退出单个Activity**:可以使用`finish()`方法。 - **退出整个应用**:对于Android 2.1之前的版本,可以使用`ActivityManager.restartPackage()`方法,但需要注意权限问题。对于2.2及更高版本,可以通过手动管理...

    android面试题

    - **遍历并关闭所有Activity**:在Application类中维护一个所有Activity的列表,当需要退出时,遍历列表并调用每个Activity的`finish()`方法。 通过深入理解`Activity`的生命周期以及状态保存机制,开发者能够更好...

    Android精简面试总结

    - **记录打开的Activity**:每次启动新Activity时进行记录,并在需要退出时遍历列表逐个调用`finish()`方法。 - **发送特定广播**:定义一个特定的广播,当接收到此广播时,各个Activity响应并执行`finish()`方法...

    Android 双击Back键退出应用的实现方法

    Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); // 启动定时器,2秒后重置quit标识 new Timer(true).schedule(new TimerTask() { @Override public void run() { quit = false; // ...

    android知识

    例如,`MyApplication`类作为应用级别的基类,可以在其中维护一个`Activity`列表,通过`addActivity()`方法添加新开启的Activity,`exit()`方法则用于遍历所有Activity并调用`finish()`方法,实现应用的优雅退出。...

    Android操作系统之内存回收策略

    如果系统需要更多资源,即使用户尚未完全退出应用,Android也会销毁Activity,释放其占用的内存。 为了提高内存效率,开发者需要理解这些机制,并在编写应用时遵循最佳实践。例如,及时释放不再使用的资源(如图片...

    android教程之service使用方法示例详解

    这个例子中,我们有一个名为AcMain的Activity,它包含了四个按钮,分别用于启动Service、停止Service、绑定Service和退出Activity。 ```java public class AcMain extends Activity implements OnClickListener { ...

Global site tag (gtag.js) - Google Analytics