Android 完全退出应用程序
随着业务逻辑越来越复杂,退出应用程序也不像之前那个直接将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();
Android 完全退出应用程序的更多相关文章
- android完全退出应用程序
android 完全退出应用程序android android 退出应用程序, 单例模式管理Activity引自:http://www.yoyong.com/archives/199android 退 ...
- android 安全退出应用程序的几种方法
android 安全退出应用程序的几种方法 正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程.a ...
- android 完全退出应用程序(重要)
android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个A ...
- Android完全退出应用程序,完美解决方案
最近公司工作不是很忙,就抽空研究了下Android的引导页,但是在写完引导页并且进入到住页面之后,在退出时,采用"再按一次退出"的方式去实现的,用的方式是杀掉进程跟exit,即:a ...
- 【转】android 完全退出应用程序
原文网址:http://www.yoyong.com/archives/199 android退出应用程序会调用android.os.Process.killProcess(android.os.Pr ...
- android 完全退出应用程序(经过严格验证)
今天解决了如何彻底结束Android应用程序的方法.网上有很多的参考方法,什么finish():android.os.Process.killProcess(android.os.Process.my ...
- 我的Android进阶之旅------>Android安全退出应用程序的几种方式
当应用不再使用时,通常需要关闭应用,可以使用以下几种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程. 建议使用这种方式 android.os.Process.kil ...
- Android 安全退出应用程序的方法总结
正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程. android.os.Process.kil ...
- android 完美退出应用程序。
Android 程序在点击回退键时,如果只有一个activity,调用finish()方法就能退出界面,如果有多个界面,在调用该方法时,只会销毁当前的activity,显示栈顶的其它activity, ...
随机推荐
- MS-DOS Batch Script Template
@echo off @setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION @rem Name: @rem Purpose: @rem @rem Autho ...
- treetable adding nodes at root level
describe("loadBranch()", function() { beforeEach(function() { this.newRows = " ...
- Java入门第37课——猜字母游戏之设计数据结构
问题 有猜字母游戏,其游戏规则为:程序随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串.玩家可以猜测多次,每猜测一次,则由系统提示结果.如果猜测的完全正确,则游戏结 ...
- 【linux】 下根目录,家目录区别,以及普通用户到root用户的切换
一:家目录 一般普通用户,家目录是/home/用户名 root用户,家目录是/root root登录系统,执行如下命令进入root的家目录 cd /cd ~ 进入家目录后执行如下命令获取具体路径 pw ...
- 设置CAD显示窗体
AcDbViewTableRecord view; AcGePoint3d max = acdbHostApplicationServices()->workingDatabase()-> ...
- 当点阵字库遇到3D
早在遥远的DOS时代,点阵汉字库为计算机处理汉字起到了关键作用.当时的显示器在图形模式下的分辨率只有640x480甚至320x200,显示汉字直接使用点阵字库在屏幕上打点就可以了.如今的电脑屏幕甚至手 ...
- 经典书籍---MySQL经典书籍下载
以下是一些经典的MySQL书籍电子版,括号内为提取码,若需自取. 欢迎阅读纸质版,尊重作者版权 高性能MySQL_中文版 [ hre3 ] 高性能MySQL_英文版[ m2xj ] MySQL技术内幕 ...
- pipreqs(找当前项目依赖的包)
pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本.就是当别人给你一个程序的时候,你要在自己电脑上运行起来,就需要安装程序所依赖的组件,总不能自己一个一个找吧. # 安装 pip3 ...
- linux ltrace-跟踪进程调用库函数的情况
当前位置:硬件 | 监测 | 内核 | Shell / 性能监测与优化 /ltrace ltrace命令是用来跟踪进程调用库函数的情况. 语法 ltrace [option ...] [command ...
- win10 ubuntu 子系统安装php
apt-get install python-software-propertiesadd-apt-repository ppa:ondrej/phpapt-get updateapt-get ins ...