2 usniyo usniyo 于 2013.02.21 10:32 提问

android 关于Application中使用System.exit(0)退出应用的一个问题。

求解,关于android Application中使用System.exit(0)退出应用导致启动Activiry时闪退的一个问题:
在一个项目中看到在Application中使用System.exit(0)来实现应用的完全退出,因此自己也照着做了,但项目中应用的退出并没有让Activiry走完它的生命周期,所以我用了以下的方法:

public class App extends Application {
    private int mLock = 0;
    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                mLock++;
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                try {
                    //模拟Activity Destroyed耗时过长,增大问题出现的概率
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                }
                mLock--;
                if(mLock<=0){
                    exit();
                }
            }
            @Override
            public void onActivityStopped(Activity activity) {}
            @Override
            public void onActivityStarted(Activity activity) {}
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
            @Override
            public void onActivityResumed(Activity activity) {}
            @Override
            public void onActivityPaused(Activity activity) {}

        });
    }

    public void exit() {
        System.exit(0);
    }

}

但是这样的话问题就出现了,如果我退出了最后一个Activity(退出应用)后,马上又快速地启动应用,这时Activity没有启动完成就退出了(闪退)。
求解决办法,谢谢!

29个回答

jtkk
jtkk   2014.11.25 22:46
已采纳

无论如何,不应该在Android中使用System.exit(0),不是标准的退出App的做法。

usniyo
usniyo 谢谢!也抱歉,这问题提了这么久后也没多关注,竟不知道有这么多好心人来帮忙解答,惭愧。是的,不应该这么做,也没太多必要。现在也不会再纠结于非要完全退出这样一个傻问题了,之前提出这问题是因为那时才刚开始学习Android。
3 年多之前 回复
Brightshadow11111
Brightshadow11111   2014.11.19 09:08

如果你想要按退出的时候能够一下子退出应用,那么把所有的 activity实例在application中维护一个 ArrayList 退出的时候遍历这个list ,每个都finish掉就O实现了完全退出了。
System.exit(0) 这个是直接干掉的,不走生命周期方法

longyc2010
longyc2010   2014.11.20 11:11

综上,应用完全退出的目的,一般都是为了释放占用的大量资源。例如浏览器在使用过程中,会占用系统非常庞大的内存资源,当浏览器退出进入后台,此时浏览器并没有完全释放占用的内存,知道该进程被kill掉,才会释放。

对于使用Activity来说,finish()最后还是会调用onDestroy()来完成Activity的退出的一些资源的释放,数据的存储等。所以,让应用闪退本身就是一个问题。
方法两种:
1.System.exit(0),

  1. Android.os.Process.killProcess(android.os.Process.myPid()); 杀死当前进程。 作用是一样的,一般都是在调用应用的finish()后,让后调用这些函数,完全退出应用程序进程,进而释放资源。
qq_24529013
qq_24529013   2014.12.15 15:00

非常适用 太感谢分享了!

Xuhw1991
Xuhw1991   2015.01.03 14:45

写个ACTIVITY接口就好了

mansuifengqi
mansuifengqi   2013.02.21 11:15

强制关闭一个Activity后不能继续调用它的生命周期,尤其是onDestroy()。用finish()

void exit()
{

    finish();

}
usniyo
usniyo 我上面的方法是可以完成activity的生命周期的,只是所有的activity都destroy之后结束应用的进程。但这样做有个问题:当应用要结束自己的进程时,这时候所有activity都destroy了,但当还没来得及调用System.exit()时,又启动了一个activity,然后才来得及调用System.exit(),这时候就会出现闪退了。如何避免这个问题呢?
大约 5 年之前 回复
zhengdanimu
zhengdanimu   2013.02.21 11:28

没有用过system.exit(0)。那个和android编码业务相悖。它的设计是要立即退出应用程序,但是这不是你想要的。如果用户按下了“home”或者是“back”键,Activity将从stack中弹出,而且所有的生命周期方法都会被调用。如果你有理由离开app的pre-maturely,另一种方法是用finish()方法。

usniyo
usniyo 嗯,可是我的目的是要结束应用的进程(某些需要,不考虑应不应该这样做),只是在默认启动的activity destroy之后,而不是在其他activity上做结束进程这一操作,我用以上方法的目的是为了保证应用所启动的所有activity都能完成其生命周期。但这样做就出现了问题所描述的问题,这应该是多线程同步的问题,但我在application已经sleep了啊,为何还能在sleep期间创建activity?难道application和activity不在同一线程,但它们的线程id都是1啊?
大约 5 年之前 回复
zhengdanimu
zhengdanimu 你想调用finish()。如果你的Activity不是在stack中的最后一个,那么你希望在onActivityResult()中的其他Activity来检查第一个被调用的finish()。直到所有的activity都pop,级联才会结束。
大约 5 年之前 回复
zhengdanimu
zhengdanimu 这个应用程序将永远在memory中。这是它的工作方式。一旦它准备好了,android OS将进行清理。
大约 5 年之前 回复
usniyo
usniyo finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收。
大约 5 年之前 回复
usniyo
usniyo 我想要的是当所有的activity都destroy之后退出应用(结束应用的进程)。但这样做有个问题:当应用要结束自己的进程时,这时候所有activity都destroy了,但当还没来得及调用System.exit()时,又启动了一个activity,然后才来得及调用System.exit(),这时候就会出现闪退了。如何避免这个问题呢?
大约 5 年之前 回复
bingdongguke
bingdongguke   2014.11.19 10:40

没有完全明白你为什么要System.exit.如果是为了异常处理,可以用CrashHandler 来时先退出而且不会出现楼主得状况。

aa20616012
aa20616012   2014.11.19 17:26

用 finish()啊

aa20616012
aa20616012   2014.11.19 17:28

用 finish()啊

共29条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!