You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:57:48