【问题标题】:Programmatically Exit Android Application Without finish()在没有完成()的情况下以编程方式退出 Android 应用程序
【发布时间】:2014-03-01 20:38:55
【问题描述】:

在你告诉我这个问题已经被问到之前,让我告诉你,这些问题都没有适合我的答案。我的应用程序有一个主要活动。在它运行之前,我有一个启动屏幕活动。如果我调用finish(),程序将返回到我的启动画面。我不想要这个。不要告诉我使用finish()。我听说不让 Android 自行关闭应用程序是不好的做法。我知道我在做什么......可能......

我希望能够从 second 活动中完全关闭应用程序。有谁知道我可以这样做吗?

【问题讨论】:

  • 致电finish() 肯定不是坏习惯;这是完成活动的正确方法。
  • @PaulLammertsma 我没有说这是一个坏主意,我说任何其他方法都是。
  • 没关系,我只是指出你提到的这不是坏习惯。我在答案中提供了两种替代方式。

标签: java android


【解决方案1】:

当你想关闭你的应用程序时,你可以调用

   finishAffinity();

或 如果你想在后台关闭它,你也应该写,

android:excludeFromRecents="true"

在 AndroidManifest 中:

   <activity
    android:name="com.smart.remote.main.SplashActivity"
    android:configChanges="orientation|keyboardHidden"
    android:screenOrientation="portrait" 
    android:excludeFromRecents="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

【讨论】:

    【解决方案2】:

    在您创建第二个activity 之前,在您的初始屏幕中使用finish(),然后使用finish() 是第二个activity:这不会带回splash屏幕。

    【讨论】:

    • 谢谢!完美运行!
    【解决方案3】:

    在启动活动上执行finish() 是一种解决方案,但两种替代方法是:

    1. 启动启动活动with android:noHistory="true" in its manifest entry。
    2. 启动辅助活动with the Intent flag FLAG_ACTIVITY_CLEAR_TOP。

    我的偏好是第一个,因为用户不太可能希望在历史堆栈中看到启动画面(或者根本不想看到这个问题,但这是一个不同的讨论)。

    【讨论】:

      【解决方案4】:

      finishAffinity();

      这只是从应用程序中退出

      【讨论】:

        【解决方案5】:

        在任何 Activity 上调用 finish() 都会通过其生命周期来销毁它。确定销毁片段会将其从后台堆栈中删除。

        所以,您必须首先从您的启动活动中调用finish(); 方法,然后使用以下意图启动MainActivity

        finish();
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        startActivity(intent); 
        

        Yoi 也可以通过用一个空的方法覆盖 OnBackPressed 方法而不调用 Super.onBackPressed (); 来解决这个问题

        【讨论】:

          【解决方案6】:

          即使你不想要它,我很遗憾地告诉你,干净地退出的唯一方法是使用finish()。如果您在后台关闭 Activities 时遇到问题,还有另一种解决方案,请查看 this link。

          基本上没有 一键式 或 all-at-once 方式来完成此操作,并且不要使用 System.exit(),这是一种不好的做法,因为您可以阅读here。

          【讨论】:

            【解决方案7】:

            完成是要走的路。一旦不再需要,您实际上可以关闭 SplashScreen 活动。 IE。在不再需要 SplashScreen 之后,只需在开始主要活动后调用完成即可。

            另外,finish() 不会关闭你的应用程序,即使在调用它之后你的应用程序的进程仍然存在,你所有的静态变量仍然有效,当然直到 android 决定终止你的应用程序,这可能会发生很长时间通话结束后。

            【讨论】:

              【解决方案8】:

              编辑:为了清楚起见,这不是退出应用程序的正确方式。使用风险自负。 OP 要求退出应用程序的 一种 方式,即使它不是正确 方式。

              System.exit(0)
              

              这就是你要找的吗?

              【讨论】:

              • 不,这只会退出当前的Activity。
              • @nKn 我知道不应该使用它。公平地说,整个问题(如作者所述)是“我不应该这样做,但仍然......”。所以我真的不认为我应该得到-1。
              • @John Android 文档明确声明了Causes the VM to stop running and the program to exit with the given exit status. 用于exit() 方法。它如何仅退出当前活动? (来源:developer.android.com/reference/java/lang/System.html#exit(int))
              • @dextor 刚刚测试过了。当我调用 System.exit(0) 时,它会打开启动画面。我不知道为什么,也许 Google 的实施很糟糕,但它不起作用。
              • 基本上,你们都在这里 - 属于应用程序的所有内容(除非它明确是多进程)已退出。但是,在 Android 看来,应该存在的东西将在一个新的过程中重新创建。所以为了有效,你必须让 Android 相信你想要退出的东西不再应该存在,而仅仅调用 System.exit() 并不能做到这一点——相反,Android 有点像拥有处理后台进程以释放内存,然后在后台重新创建它。
              【解决方案9】:

              我完全同意你的观点,finish() 不知何故不实用,但无论如何你都可以简单地使用它,而且我认为所有这些都是“犹太”的最佳实践。

              这是一个简短的教程,供您处理应用中任何其他活动的“退出”:

              我假设启动画面是您应用中的第一个活动。

              1. 如果您的应用程序中还有一个主屏幕/主屏幕,则在您的 Splash 活动中使用 Intent 调用主/主页后立即完成启动活动,例如

              startActivity(new Intent(getApplication(), Home.class)); Splash.this.finish();}

              完成此操作后,请按照步骤 2 进行操作。但不要在初始屏幕中覆盖 onResume,而是在主屏幕/主屏幕中覆盖它。

              2. 如果您的用户稍后需要访问初始屏幕,请不要finish()您的初始屏幕,而是覆盖其 onResume 方法,如下所示:

              @Override protected void onResume() { super.onResume(); try { Intent i = getIntent(); Boolean isExit = i.getBooleanExtra("isExitAction",false); if(isExit){ this.finish(); } } catch (Exception e){} }

              3. 在您要关闭应用程序的活动中,使用以下代码退出最适合您的位置。不要忘记替换Home.class,这取决于您的第一个未完成的活动。

                      Intent i = new Intent(this, Home.class);
                      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                      i.putExtra("isExitAction", true);
                      startActivity(i);
              

              它的作用:如果您从第 5 个活动中按下一个按钮,该按钮会在第 3 步中触发代码,它会完成所有先前的活动 4、3、2 并将您“重定向”到活动 1,即您的主页(或 Splash )。 重定向后,onResume() 被调用,并完成最后剩余的活动。仅当isExitAction 为真时,应用程序才会到达this.finish()

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-10-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-29
                • 2011-09-13
                • 1970-01-01
                • 2015-03-05
                相关资源
                最近更新 更多