System.exit(0) 导致 Activity 在应用启动时快速退出

Posted

技术标签:

【中文标题】System.exit(0) 导致 Activity 在应用启动时快速退出【英文标题】:System.exit(0) causes the Activity quit quickly when the app starts 【发布时间】:2013-02-21 03:05:21 【问题描述】:

我遇到了一个问题,System.exit(0) 导致应用启动时 Activity 快速退出:

在一个项目中,我看到使用System.exit(0)实现app的完全退出,我这样做了,但是activity在项目中没有经过它的生命周期,所以我使用了以下方法:

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 
                    //Simulation Activity Destroyed too time consuming and increase the probability of problems

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


但是,问题出现了,如果我退出最后一个活动(退出应用程序),并立即快速启动应用程序,然后活动退出但它没有启动完成(闪退)。

编辑 我想要做的是在所有活动都被破坏时退出应用程序。但是,有一个问题:当应用程序想要完成自己的进程时,所有活动都被破坏了,但是甚至没有调用 System. exit(),启动一个activity,然后调用System.exit(),此时会闪退,如何避免这个问题?

好吧,不过我的目的是结束应用进程(有些需要,不考虑是不是应该做),只是在默认启动activity的destroy之后,而不是在任何其他activity中做结束这个操作过程中,我使用上面的方法是为了保证所有的startactivity都能够在app中完成它的生命周期。但这有问题描述,这应该是多线程同步问题,但我在应用程序中有睡眠,为什么它可以在睡眠期间创建活动?不要application和activity不是同一个线程,但是它们的thread id是1。

【问题讨论】:

为什么使用 System.exit 而不是 Activity.finish? System.exit 退出我想的整个过程。 @JermaineXu 是的,我要做的是完成申请过程 【参考方案1】:

永远不要使用 System.exit(0)。这违背了 android 编码实践。它旨在立即退出应用程序,这不是您想要的。如果用户按下“Home”或“Back”,则 Activity 将从堆栈中弹出并调用所有这些生命周期方法。如果您有理由提前离开应用程序,另一种方法是使用finish() 方法。

【讨论】:

我想要做的是在所有活动都被破坏时退出应用程序。但是,有一个问题:当应用程序想要完成自己的进程时,所有活动都被破坏了,但是甚至没有调用系统。 exit(),启动一个activity,然后调用System.exit(),这个时候会闪退,如何避免这个问题? 什么finish()函数只是退出activity,而不是应用程序,应用程序还在内存中,除非系统恢复。 应用程序将始终在内存中。这就是它的工作方式。 Android 操作系统会在它准备就绪后对其进行清理。 你想调用finish()。如果您的活动不是堆栈中的最后一个活动,那么您希望其他活动检查第一个活动是否在 onActivityResult() 中调用了完成()。级联完成,直到所有活动都弹​​出。 但是我的目的是结束应用进程(有些需要,不考虑是不是应该做的),只是在默认启动activity的destroy之后,而不是在任何其他activity中做结束在这个操作过程中,我使用上面的方法是为了保证所有的启动activity都能在app中完成它的生命周期。但这有问题描述,这应该是多线程同步问题,但我在应用程序中有睡眠,为什么它可以在睡眠期间创建活动?不要application和activity不是同一个线程,但是它们的线程id是1。【参考方案2】:

只是为了让你知道。强制关闭 Activity 或 Android 应用程序将不会继续调用其生命周期方法,特别是 onDestroy()。请改用finish()

void exit()


    finish();


如果您真的想退出您的 Android 应用,请关闭所有活动、服务和/或广播接收器,Android 系统将有权终止您的进程。

【讨论】:

我想要做的是在所有活动都被破坏时退出应用程序。但是,有一个问题:当应用程序想要完成自己的进程时,所有活动都被破坏了,但是甚至没有调用系统。 exit(),启动一个activity,然后调用System.exit(),此时会闪退,如何避免这个问题?

以上是关于System.exit(0) 导致 Activity 在应用启动时快速退出的主要内容,如果未能解决你的问题,请参考以下文章

在 System.exit(0) 处解除绑定

System.exit和System.exit区别

System.exit(0) 之间的区别;和 Platform.exit();? [复制]

为啥即使在 System.exit(0) 之后也需要返回;

Java:如何测试调用 System.exit() 的方法?

在 java 中使用 System.exit(0) 退出程序