最近在做一个android的项目,我主要负责服务器。这段时间不忙,就帮他们解决一些前台的技术问题。
刚刚就解决了一个问题,在退出应用后,所有尚未finish的activity都会依次弹出,这样显然是不合理的。
网上查了一些资料,根据项目实际情况,解决了此问题,下面把发放记在这里,大家如果发现有什么问题欢迎指教,相互交流才能共同进步。
解决这个问题要充分理解activity的生命周期。这个对一些新手如我来说是很重要的。下面贴出生命周期图。
我的解决方法就是重写每个activity的onResart()方法,在里面将当前界面finish()掉。这样做的原因是onResart()只会在activity从onStop转到onStart()中时才会调用,具体来说就是当你新生成一个activity时,你的调用流程是onCreate()->onStart()->onResume(),到了onResume()你的activity就可见了;当你从这个方法离开,但并没有finish这个方法,以后你再进入的时候,你的调用流程是onRestar()->onStart()->onResume();写到这里大家应该发现了,我只要在onRestart()里面放依据finish(),那么在我退出了整个android程序的时候,就会finish掉所有我尚未finish掉的activity,而且在程序运行的时候不会把我刚刚生成的activity给finish掉(因为新生成的会调用onCreate,不会调用onRestart,源代码如下:
protected void onRestart()
{
super.onRestart();
finish();
}
大家应该发现了这个方法的弊端,那就是当你在程序运行的时候,想回到一个你之前离开时没有finish的界面,这个界面会被finish掉(因为调用了onRestart())。这个问题的解决方案就是在系统内部设置一个全局变量exit,当程序运行时exit=false,而当程序退出时修改exit=true。每当你进入一个没有finish的activity时,在onRestart()中判断一下exit的值,如果exit=false则不调用finish,exit=true调用finish。这样当程序运行时不会将这些activity给finish掉,而一旦你退出程序,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,详细看第一部分代码和第二部分代码之间那段)。
写到这里目前的解决方案就都写完了,有什么错误或者存在什么隐患,欢迎大家指教。
新人第一篇博客,多谢大家支持。
分享到:
相关推荐
例如,当用户点击应用内的“退出”按钮时,开发者可能希望关闭所有正在运行的Activity,而不是仅仅关闭当前Activity。 #### 关键概念 1. **Activity**:Activity是Android四大组件之一,代表了一个屏幕界面。每个...
- **退出单个Activity**:可以使用`finish()`方法。 - **退出整个应用**:对于Android 2.1之前的版本,可以使用`ActivityManager.restartPackage()`方法,但需要注意权限问题。对于2.2及更高版本,可以通过手动管理...
- **遍历并关闭所有Activity**:在Application类中维护一个所有Activity的列表,当需要退出时,遍历列表并调用每个Activity的`finish()`方法。 通过深入理解`Activity`的生命周期以及状态保存机制,开发者能够更好...
- **记录打开的Activity**:每次启动新Activity时进行记录,并在需要退出时遍历列表逐个调用`finish()`方法。 - **发送特定广播**:定义一个特定的广播,当接收到此广播时,各个Activity响应并执行`finish()`方法...
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); // 启动定时器,2秒后重置quit标识 new Timer(true).schedule(new TimerTask() { @Override public void run() { quit = false; // ...
例如,`MyApplication`类作为应用级别的基类,可以在其中维护一个`Activity`列表,通过`addActivity()`方法添加新开启的Activity,`exit()`方法则用于遍历所有Activity并调用`finish()`方法,实现应用的优雅退出。...
如果系统需要更多资源,即使用户尚未完全退出应用,Android也会销毁Activity,释放其占用的内存。 为了提高内存效率,开发者需要理解这些机制,并在编写应用时遵循最佳实践。例如,及时释放不再使用的资源(如图片...
这个例子中,我们有一个名为AcMain的Activity,它包含了四个按钮,分别用于启动Service、停止Service、绑定Service和退出Activity。 ```java public class AcMain extends Activity implements OnClickListener { ...