如何在Android Studio Kotlin中实现按下返回键关闭应用
解决方案
要实现按下返回键直接关闭并退出应用,需要完成三个关键操作:停止闪光灯的循环任务、关闭闪光灯、关闭当前Activity并终止应用进程。具体修改如下:
1. 新增全局Handler变量
在类的成员变量区域添加Handler声明,方便后续在返回操作中控制循环任务:
private lateinit var handler: Handler
2. 修改startFlashLight方法绑定全局Handler
将原方法内的局部Handler替换为全局变量,确保返回键能访问到该Handler:
fun startFlashLight() { openFlashLight() flashLightOn = true handler = Handler(Looper.getMainLooper()) handler.postDelayed(object: Runnable { override fun run() { if (flashLightOn) { closeFlashLight() } else { openFlashLight() } flashLightOn = !flashLightOn handler.postDelayed(this, counter) } }, counter) }
3. 完善onBackPressed方法逻辑
在空实现的onBackPressed中添加完整退出逻辑:
override fun onBackPressed() { // 停止Handler的所有延迟任务,避免内存泄漏 handler.removeCallbacksAndMessages(null) // 确保闪光灯关闭 if (flashLightStatus) { val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = cameraManager.cameraIdList[0] try { cameraManager.setTorchMode(cameraId, false) } catch (e: CameraAccessException) { e.printStackTrace() } } // 关闭当前Activity并终止应用进程 finish() android.os.Process.killProcess(android.os.Process.myPid()) }
完整修改后的代码
package com.example.flashlight import android.content.Context import android.hardware.camera2.CameraAccessException import android.hardware.camera2.CameraManager import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Handler import android.os.Looper import android.widget.SeekBar import android.widget.TextView class MainActivity : AppCompatActivity() { var flashLightStatus: Boolean = false var flashLightOn = false var counter: Long = 0 private lateinit var handler: Handler // 全局Handler变量 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.textView) val seek = findViewById<SeekBar>(R.id.seekBar) seek.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged( seekBar: SeekBar?, progress: Int, fromUser: Boolean ) { counter = progress.toLong() textView.text = counter.toString() } override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar?) = Unit }, ) startFlashLight() } override fun onBackPressed() { handler.removeCallbacksAndMessages(null) if (flashLightStatus) { val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = cameraManager.cameraIdList[0] try { cameraManager.setTorchMode(cameraId, false) } catch (e: CameraAccessException) { e.printStackTrace() } } finish() android.os.Process.killProcess(android.os.Process.myPid()) } private fun openFlashLight() { val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = cameraManager.cameraIdList[0] if (!flashLightStatus) { try { cameraManager.setTorchMode(cameraId, true) flashLightStatus = true } catch (e: CameraAccessException) { e.printStackTrace() } } else { try { cameraManager.setTorchMode(cameraId, false) flashLightStatus = false } catch (e: CameraAccessException) { e.printStackTrace() } } } private fun closeFlashLight() { val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = cameraManager.cameraIdList[0] if (flashLightStatus) { try { cameraManager.setTorchMode(cameraId, false) flashLightStatus = false } catch (e: CameraAccessException) { e.printStackTrace() } } else { try { cameraManager.setTorchMode(cameraId, true) flashLightStatus = true } catch (e: CameraAccessException) { e.printStackTrace() } } } fun startFlashLight() { openFlashLight() flashLightOn = true handler = Handler(Looper.getMainLooper()) handler.postDelayed(object: Runnable { override fun run() { if (flashLightOn) { closeFlashLight() } else { openFlashLight() } flashLightOn = !flashLightOn handler.postDelayed(this, counter) } }, counter) } }
关键说明
- 全局Handler用于控制闪光灯的循环任务,避免返回后任务仍在后台运行导致内存泄漏
- 退出前强制关闭闪光灯,防止应用退出后闪光灯持续开启
finish()关闭当前Activity,killProcess确保应用进程完全终止
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

