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

Android Kiosk应用24/7运行数周后熄屏退回主界面问题求解

问题根因

  1. Kiosk模式完全未生效
    你代码中仅配置了锁任务允许的应用包,既没有实现点击左上角7次开启Kiosk的触摸监听逻辑,也没有调用startLockTask()启动锁任务模式,mIsKioskEnabled始终为默认值false。这种状态下系统不受Kiosk规则限制,可正常息屏、回收后台Activity,同时任意返回操作都会触发onBackPressed里的finish()逻辑,直接关闭WebViewActivity回到MainActivity。你遇到的唤醒后直接回到MainActivity的问题,本质是WebViewActivity已经在息屏阶段被系统销毁了。
  2. 屏幕常亮flag可能失效
    FLAG_KEEP_SCREEN_ON仅在窗口保持前台聚焦时有效,你只在onCreate中添加了该flag,当窗口出现短暂失焦(比如系统弹出临时通知、权限提示)后flag会被清除,就会触发系统默认的息屏规则,和你观察到的「无操作时间越长越容易息屏」的现象完全吻合。
  3. WebView异常导致Activity销毁
    WebView加载网页时如果出现未捕获的异常,会直接导致所属的WebViewActivity崩溃,应用会自动回退到Activity栈的上一个页面也就是MainActivity。长期运行下WebView的内存泄漏也会导致系统主动杀死占用内存过高的WebViewActivity。

解决方案

1. 补全Kiosk模式开启逻辑

在WebViewActivity中添加触摸事件监听,实现点击左上角7次开启锁任务的逻辑:

override fun onTouchEvent(event: MotionEvent?): Boolean {
    event ?: return super.onTouchEvent(event)
    if (event.action == MotionEvent.ACTION_UP) {
        // 匹配左上角100*100像素的点击区域,可根据需要调整大小
        if (event.x < 100 && event.y < 100) {
            val currentTime = System.currentTimeMillis()
            // 超过3秒的点击不视为连续点击
            if (currentTime - startMillis > 3000) {
                count = 0
            }
            startMillis = currentTime
            count++
            if (count == 7) {
                count = 0
                if (mDpm?.isLockTaskPermitted(packageName) == true) {
                    // 启动锁任务模式,真正开启Kiosk
                    startLockTask()
                    mIsKioskEnabled = true
                    Toast.makeText(this, "Kiosk模式已开启", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
    return super.onTouchEvent(event)
}

如果需要设备开机后自动进入Kiosk模式,可以在onCreate逻辑末尾直接调用上述开启逻辑,不需要手动点击触发。

2. 修复屏幕常亮失效问题

在WebViewActivity的onResume生命周期中重新添加常亮flag和沉浸模式配置,避免窗口失焦后配置丢失:

override fun onResume() {
    super.onResume()
    // 重新添加屏幕常亮flag
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    // 重新配置沉浸全屏模式
    if (currentApiVersion >= Build.VERSION_CODES.KITKAT) {
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
                View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    }
}

同时需要手动将应用加入设备的电源优化白名单,避免系统省电机制强制熄屏。

3. 避免异常后退回到MainActivity

修改MainActivity跳转到WebViewActivity的启动flag,清空Activity栈,这样就算WebViewActivity崩溃也不会回到MainActivity:

val intent = Intent(this@MainActivity, WebViewActivity::class.java)
intent.putExtra("url", url)
// 添加清空栈的flag,WebViewActivity成为唯一的Activity
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)

可以额外添加崩溃自动重启逻辑,捕获应用未处理异常时自动重新打开WebViewActivity加载之前保存的URL。

4. 优化长期运行稳定性

  • 给WebView添加异常捕获逻辑,避免WebView崩溃直接带走Activity,异常时自动重载页面
  • 定期(比如每天凌晨低峰期)自动重载页面,清理WebView的缓存和内存占用,降低内存泄漏导致的被系统回收概率
  • 错误重试逻辑添加次数限制,避免网页持续报错时出现无限重试死循环

内容的提问来源于stack exchange,提问作者Perceptio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:27:00