随着业务逻辑越来越复杂,退出应用程序也不像之前那个直接将Activity finish()掉就可以了,在网上看到很多完全退出App的文章,但是实践之后发现,并不像文章中描述的那样,不是方法过时了,就是在某些SDk版本下不好用,
最后经过多次实践,找到两种方法可以完美解决现在业务需要的完全退出App的方法:
方法一:
1.将LoginActivity的launcMode设置成singleTask,然后让它始终占据栈底的位置,其他操作需要退回到LoginActivity时,只需要调用Actvity的startActivity()方法启动LoginActivity即可,因为SingleTask模式会保持栈中只有一个实例,当要启动的Activity在栈中已经存在时,系统会自动将LoginActivity上的Activity出栈,让LoginActivity显示在栈顶,这种情况仅适用于LoginActivity不需要更新的情况。
2.当LoginActivity中的数据需要更新,我们又该怎么做呢?研究Activity的生命周期不难发现,当Activity真正显示的时候,总会调用Activity的resume()方法,那么我们就可以在这里执行一些更新界面的操作,
想了解Activity生命周期的话,可以看这篇文章:http://www.cnblogs.com/butterfly-clover/p/4428313.html
3.上面讲述的是退回到登录页,那么如果我想再首页直接退出app又该执行什么操作呢?很简单,在退出方法中,启动LoginActivity,这样现在栈中就只剩LoginActivity了,然后通过一个参数控制,告诉LoginActivity我是要退出,然后LoginActivity自己把自己结束掉就可以了
方法二:方法一所提供的解决方案,对于某些人来讲可能有点复杂,现在再提供一种更直接的,即通过单例模式创建一个ActivitManager。使用单例模式,有两种实现方法,一是采用链表,另一个是采用栈,表面看,栈更符合Activity的管理,但如果仅仅是为了解决完全退出App的问题,个人觉得链表的方案更简单,具体根据个人需求选择
链表方式:启动Activity时把它加入链表,退出App时,清空链表下面上实现代码:
(1)MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作)
public class MyApplication extends Application { private List<Activity> activityList = new LinkedList<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized (MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityList.add(activity); } public void exit() { try { for (Activity activity : activityList) { if (activity != null) activity.finish(); } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); } } public void onLowMemory() { super.onLowMemory(); System.gc(); } }
(2)在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中
MyApplication.getInstance().addActivity(this);
注:如果觉得在每个Activity中调用这句代码比较麻烦,可以定义一个BaseActivity类继承自Activity,在BaseActivity的onCreate方法中加入这句代码,然后让其他的Activity继承BaseActivity即可。
(3)在需要结束所有Activity的时候调用exit方法
MyApplication.getInstance().exit();
栈方式:启动Activity时使它入栈,结束Activity的时候,使它出栈,退出App时,清空栈,下面上实现代码:
(1)MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作)
代码1:用stack的push()和pop()方法
public class MyApplication extends Application { private static Stack<Activity> activityStack =new Stack<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized(MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityStack.push(activity); } public void exit() { try{ while (!activityStack.isEmpty()){ Activity activity = activityStack.lastElement(); activity.finish(); activityStack.pop(); activity = null; } }catch (Exception e){ e.printStackTrace(); }finally{ System.exit(0); } } public void onLowMemory(){ super.onLowMemory(); System.gc(); } }
代码2:用stack继承自Vector,调用Vector的add()和remove()方法
public class MyApplication extends Application { private static Stack<Activity> activityStack = new Stack<Activity>(); private static MyApplication instance; public MyApplication() { } public static MyApplication getInstance() { synchronized (MyApplication.class) { if (null == instance) { instance = new MyApplication(); } } return instance; } //add Activity public void addActivity(Activity activity) { activityStack.add(activity); } public void exit() { try { while (!activityStack.isEmpty()) { Activity activity = activityStack.lastElement(); activity.finish(); activityStack.remove(activity); activity = null; } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); } } public void onLowMemory() { super.onLowMemory(); System.gc(); } }
注:代码1和代码2选择一个使用即可
(2)在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中
MyApplication.getInstance().addActivity(this);
注:如果觉得在每个Activity中调用这句代码比较麻烦,可以定义一个BaseActivity类继承自Activity,在BaseActivity的onCreate方法中加入这句代码,然后让其他的Activity继承BaseActivity即可。
(3)在需要结束所有Activity的时候调用exit方法
MyApplication.getInstance().exit();