在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?
Grendel 这里绝对是最简单的两种关闭 Kotlin App 的方法 第一种方式将在重新加载时在 PageTwo 上打开应用程序 不优雅,但我考虑到有人有闪屏的可能性
moveTaskToBack(true);
exitProcess(-1)
第二种方法太简单太老了你会尖叫 它将关闭 Kotlin 应用程序,重新加载时首先显示 MainActivity
finishAffinity()
我使用 Nexus 9 API 26 进行了测试,我没有三星 Galaxy S2 但请随时给我寄一份哈哈
从 API 21 开始您可以使用
finishAndRemoveTask()
这有效:
android.os.Process.killProcess(android.os.Process.myPid())
...但是在这个问题中进行了激烈讨论的重要警告,为什么调用 Process.killProcess(Process.myPid()) 是一个坏主意?
有两种解决方案,适用于您的代码:
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
对于特定按钮:
val btn3 = findViewById<Button>(R.id.button3)
为该按钮设置任务:
btn3.setOnClickListener {
finish()
System.out.close()
}
这里有一种技术,应该将其从“最近”屏幕中删除(在 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})
如果此技术有任何最佳实践问题,请发表评论。