【问题标题】:How to close Android application in Kotlin如何在 Kotlin 中关闭 Android 应用程序
【发布时间】:2018-08-13 23:24:43
【问题描述】:

在 JAVA 中我们可以关闭应用程序。我们尝试使用 Kotlin 开发技能,并感觉我们正在使用正确的语法来关闭应用程序。问题是代码只有在您在进入第二页并返回 MainActivity 之前关闭应用程序时才有效,MainActivity 是下面的启动器活动代码

    fun onTV(view: View){
    exitProcess()
}

private fun exitProcess() {
    //finish()
    System.exit(-1)
}

finish 和 System.exit(-1) 都可以在没有导航的情况下先选择 到 PageTwoActivity

onTV 是 TextView 的 onClick 属性 我的猜测是我们需要清除堆栈购买设置标志所以问题是 Kotlin 中这个的语法是什么?请记住,我们在启动器页面上 主要活动。我们需要结果的意图吗?

好的,我尝试了这段代码,没有任何改进

    val intent = Intent(context, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOIntent.FLAG_ACTIVITY_NEW_TASK
    finish()

我们已经接近了现在的代码,但问题仍然是,如果您不导航到 PageTwo 并单击按钮以在应用程序启动后立即关闭应用程序,这将关闭应用程序

    fun onTV(view: View){
    onBYE()
}

 fun onBYE() {
     exitProcess(-1)
 }

所以我想问题是如何在执行 onBYE 时从堆栈中清除 PageTwo ?

【问题讨论】:

  • 是的,startActivityForResult 和 setResult 带有一些 EXIT_CODE,然后去听它并向后传播(带有更多的 setResuts)
  • @MarcosVasconcelos 因为我搜索并找不到示例代码,您能否发布一小段代码,正是这一行让我感到困惑 val intent = Intent(this@MainActivity, PageTwoActivity::class.java ) 声明意图是我们迷路的地方
  • @MarcosVasconcelos 我添加并编辑了我的任务,以显示我用来在 Kotlin 中构建和 Intent 的代码结构没有结果

标签: android android-intent kotlin


【解决方案1】:

Grendel 是最简单的两种关闭 Kotlin 应用程序的方法 第一种方法将在重新加载时在 PageTwo 上打开应用程序 不优雅,但我包括有人有启动画面的机会

     moveTaskToBack(true);
     exitProcess(-1)

第二种方法太简单太老了,你会尖叫 它将关闭 Kotlin 应用程序,并在重新加载时首先显示 MainActivity

finishAffinity()

我使用 Nexus 9 API 26 对此进行了测试我没有三星 Galaxy S2 但请随时给我寄一份哈哈

【讨论】:

    【解决方案2】:

    对此有两种解决方案,适用于您的代码:

    val intent = Intent(context, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOIntent.FLAG_ACTIVITY_NEW_TASK
    intent.putBooleanExtra(MainActivity.FINISH, true)
    finish()
    

    将 FINISH 声明为 val FINISH = "finish_key_extra"

    并在 MainActivity 的 onCreate 处添加此代码

    super.onCreate(state)
    boolean finish = getIntent().getBooleanExtra(FINISH, false) //default false if not set by argument
    if(finish) {
        finish();
        return;
    }
    

    由于您使用 CLEAR_TOP 和 NEW_TASK,您将只有一个活动在堆栈上,因此您通过发送参数来完成它。

    我提到的另一个解决方案是使用 startActivityForResult(intent, REQUEST_CODE_X) 启动应用程序上的每个 Activity

    并且在应用程序的每个活动上也有这个代码:(声明一个 int FINISH_APP 用作某处的结果代码)

    void onActivityResult(int requestCode, int resultCode, Bundle result) {
         if(requestCode == AppIntents.REQUEST_CODE_X)
             if(resultCode == FINISH_APP){
                 setResult(FINISH_APP);
                 finish();
             }
    }
    

    并且在任何时候你想开始关闭你调用的应用程序:

                 setResult(FINISH_APP);
                 finish();
    

    请注意,FINISH_APP 的声明与 RESULT_OK、RESULT_CANCELED 不同,因此您的应用仍然可以使用它。

    注意:我是 Java 开发人员,而不是 kotlin

    【讨论】:

    • 感谢您的建议,它们看起来很棒,尝试过很抱歉,当我将代码粘贴到简单项目中时,我们都处于“非 Kotlin”开发者的困境中,请参阅对 mducc 的评论以进行设计应用程序的如果你可以用 Java 编写,我们总是可以转换 仍然在寻找代码来关闭应用程序它应该不难,但如果不是那么乐趣在哪里
    • 其实是这样,你只需要翻译这个
    • @MarcosVasconcelow 我做了翻译,还有很多 RED 我确实添加了变量,但如果我得到结果,没有运气会让你知道
    • 这里的想法是删除堆栈并完成唯一持续的,您可以简单地创建一个新的 FinishActivity 并使用 CLEAR_TOP | 调用它。 NEW_TASK 并且您在 onCreate 上做的唯一一件事就是完成()
    【解决方案3】:

    这行得通:

    android.os.Process.killProcess(android.os.Process.myPid())
    

    ...但是在这个 SO 问题中引起了激烈讨论的重要警告,Why is calling Process.killProcess(Process.myPid()) a bad idea?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2013-07-05
      • 1970-01-01
      相关资源
      最近更新 更多