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

问题描述 投票:0回答:6

在JAVA中我们可以关闭应用程序。我们尝试培养 Kotlin 技能,并感觉我们正在使用正确的语法来关闭应用程序。问题是,只有在转到第二页并返回 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?

android android-intent kotlin
6个回答
40
投票

Grendel 这里绝对是最简单的两种关闭 Kotlin App 的方法 第一种方式将在重新加载时在 PageTwo 上打开应用程序 不优雅,但我考虑到有人有闪屏的可能性

     moveTaskToBack(true);
     exitProcess(-1)

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

finishAffinity()

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


5
投票

从 API 21 开始您可以使用

finishAndRemoveTask()

3
投票

这有效:

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

...但是在这个问题中进行了激烈讨论的重要警告,为什么调用 Process.killProcess(Process.myPid()) 是一个坏主意?


1
投票

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

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


1
投票

对于特定按钮:

val btn3 = findViewById<Button>(R.id.button3)

为该按钮设置任务:

btn3.setOnClickListener {
    finish()
    System.out.close()
}

0
投票

这里有一种技术,应该将其从“最近”屏幕中删除(在 API 21 之前的许多模拟器上进行了测试):

首先,我们创建一个新的 Activity 专门处理退出应用程序:

package com.example.yourAppNameHere import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class ActivityTimeToExitApp : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //Get The "Exit Screen" Layout setContentView(R.layout.activity_time_to_exit_app) //Immediately Exit App finishAndRemoveTask() } }
其次,当我们想要退出应用程序时,我们只需切换到此活动,同时

设置一些标志以清除后台堆栈中的任何待处理任务():

startActivity(Intent(applicationContext, ActivityTimeToExitApp::class.java).also{it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK})
如果此技术有任何最佳实践问题,请发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.