如何在 Kotlin 中关闭 Android 应用程序

Posted

技术标签:

【中文标题】如何在 Kotlin 中关闭 Android 应用程序【英文标题】:How to close Android application in Kotlin 【发布时间】: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 的代码结构没有结果 【参考方案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?

【讨论】:

以上是关于如何在 Kotlin 中关闭 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在移动 android/iOs(本机应用程序)中关闭 webview

即使应用程序在android中关闭,如何在服务应该工作时添加位置权限?

即使用户在android studio中关闭应用程序,如何保持登录状态

Android:如何从活动活动中关闭前台活动?

在Android Studio中关闭手机上的应用程序时如何不关闭套接字

如果蓝牙在 Android 应用程序中关闭,则通知