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();

时间: 2024-10-24 06:26:04

Android 完全退出应用程序的相关文章

一、 Android完全退出应用程序

在Android中,如果想退出Android程序,一般都是调用finish().System.exit(0).android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用finish().System.exit(0).android.os.Process.killProcess(android.os.Process.myPid())只能杀死当前的act

android 安全退出应用程序的几种方法

android 安全退出应用程序的几种方法 正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程.android.os.Process.killProcess(android.os.Process.myPid())通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空 第二种方法:终止当前正在运行的Java虚拟机,导致程序终止System.exit(0)

【转】android 完全退出应用程序

原文网址:http://www.yoyong.com/archives/199 android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效.如果有A,B,C三个Activity,而想在B或C中Activity退出,调用上面的方法,往往会销毁当前的Activity返回上一个Activity.当然也可以逐个返

Android完全退出应用程序,完美解决方案

最近公司工作不是很忙,就抽空研究了下Android的引导页,但是在写完引导页并且进入到住页面之后,在退出时,采用"再按一次退出"的方式去实现的,用的方式是杀掉进程跟exit,即:android.os.Process.killProcess(android.os.Process.myPid())或者System.exit(0); 但是问题出现了,因为我在进入引导页Activity跟主界面Activity之前我是还有一个欢迎页Activity的(注:这个入口Activity的作用是判断此应

android 完美退出应用程序。

http://www.2cto.com/kf/201402/276808.html Android 程序在点击回退键时,如果只有一个activity,调用finish()方法就能退出界面,如果有多个界面,在调用该方法时,只会销毁当前的activity,显示栈顶的其它activity,换言之,就是无法退出整个应用程序.下面是一种快速的退出整个应用的方法代码: private void showTips() { AlertDialog alertDialog = new AlertDialog.Bu

android 彻底退出应用程序在不同API下需要调用的方法

一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0); 1. finish()方法 该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了. 另外,还有一个方法finishActivity (int requestCode) ,关于这个方法,先看看sdk的api说明吧! view plainpri

Android完全退出应用程序

 自定义一个继承自Application的类.用来记录所打开的Activity. 在每个Activity类的onCreate方法中调用ExitApplication.newInstance().addActivity(this);将Activity类添加到list中. 在退出时调用ExitApplication.newInstance().exit();循环执行finish(); public class ExitApplication extends Application { priva

Android 怎么退出整个应用程序?

我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序,没有释放系统资源.有时跳转的activity较多时,还需要多次按返回键,这样感觉一点都不爽. 后面添加了一个菜单返回功能键,这个方法也只能用system.exit(0)来关闭当前活动的Activity,附代码:public boolean onCreateOptionsMenu(Menu menu){ su

Android 按二次后退键退出应用程序

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 <span style="font-size:10px;">private static Boolean isExit = false; private static Boolean hasTask = false; Timer tExit = n