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

Unity3D安卓开发中能否区分用户按Home键还是锁屏触发应用暂停

Unity安卓端区分OnApplicationPause触发场景的实现方案

Unity原生的OnApplicationPause/OnApplicationFocus回调本身不携带触发源参数,无法直接区分是锁屏触发还是用户切后台触发,需要结合安卓系统广播监听实现场景判定,具体方案如下:

实现逻辑

核心思路是在安卓层监听系统级广播标记状态,Unity侧拿到状态后在暂停回调中做分支判断。

具体实现步骤

1. 状态标记与回调逻辑(Unity C#侧)

首先定义全局状态和暂停回调逻辑:

// 标记当前暂停是否由锁屏触发
private bool _isPausedByLockScreen = false;

private void OnApplicationPause(bool isPaused)
{
    if (isPaused)
    {
        if (_isPausedByLockScreen)
        {
            // 锁屏触发暂停的对应逻辑
            UnityEngine.Debug.Log("触发原因:用户锁屏/熄屏");
        }
        else
        {
            // 切后台触发暂停的对应逻辑
            UnityEngine.Debug.Log("触发原因:用户按导航键最小化应用");
        }
    }
    else
    {
        // 应用恢复时重置标记,避免状态错乱
        _isPausedByLockScreen = false;
    }
}

// 供安卓层调用,更新锁屏状态
public void SetLockScreenStatus(bool isLocked)
{
    _isPausedByLockScreen = isLocked;
}

2. 安卓广播监听实现

你可以选择两种方式实现广播监听:

  • 方式1:导出安卓工程,在原生层注册ACTION_SCREEN_OFF(熄屏/锁屏)、ACTION_USER_PRESENT(解锁)广播,收到锁屏广播时调用Unity侧的SetLockScreenStatus(true),收到解锁广播时调用SetLockScreenStatus(false)。
  • 方式2:无需导出工程,直接在Unity C#中通过AndroidJavaClass动态注册广播接收器,不需要额外写原生插件。

适配注意事项

  • 安卓12及以上版本限制了ACTION_CLOSE_SYSTEM_DIALOGS广播的获取,若需适配高版本系统,可以叠加检测应用前台窗口数量的逻辑做补充判定:窗口数从1变为0且无锁屏广播触发时,判定为用户切后台。
  • 部分定制ROM的系统广播触发时机存在差异,建议针对目标机型做兼容性测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:02