最近在做一个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,详细看第一部分代码和第二部分代码之间那段)。
写到这里目前的解决方案就都写完了,有什么错误或者存在什么隐患,欢迎大家指教。
新人第一篇博客,多谢大家支持。