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

Kotlin+Jetpack Compose专注应用开发:如何在专注时段禁用其他应用?

专注会话阻止其他应用的实现方案

针对你用Kotlin+Jetpack Compose开发专注APP的需求,以下是可行的实现方案,包括你提到的Window Manager,还有更适配Android生态的系统级方案:

一、Window Manager 完全可行

通过Window Manager创建全屏覆盖层是实现该需求的经典方案,核心思路是在专注会话期间,添加一个覆盖所有应用的悬浮窗口,拦截用户的触摸操作,阻止切换到其他应用;会话结束后移除该窗口即可恢复正常使用。

实现步骤:

  1. 添加权限
    在AndroidManifest.xml中声明悬浮窗权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

注意:Android 6.0+需要用户手动在系统设置中授予该权限,你需要在代码中引导用户跳转设置页申请。

  1. 创建全屏覆盖层(Jetpack Compose 实现)
@Composable
fun FocusSessionOverlay(onExit: () -> Unit) {
    val context = LocalContext.current
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager

    DisposableEffect(Unit) {
        // 配置窗口参数
        val layoutParams = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            // 适配Android版本的窗口类型
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            } else {
                WindowManager.LayoutParams.TYPE_PHONE
            },
            // 拦截触摸事件但不获取焦点,避免影响系统状态栏
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )

        // 创建承载Compose内容的View
        val overlayView = ComposeView(context).apply {
            setContent {
                Box(
                    modifier = Modifier
                        .fillMaxSize()
                        .background(Color.Black.copy(alpha = 0.85f))
                        .clickable(enabled = false) {}, // 拦截点击
                    contentAlignment = Alignment.Center
                ) {
                    Column(horizontalAlignment = Alignment.CenterHorizontally) {
                        Text(
                            text = "专注会话进行中",
                            color = Color.White,
                            fontSize = 24.sp,
                            fontWeight = FontWeight.Bold
                        )
                        Spacer(modifier = Modifier.height(16.dp))
                        Text(
                            text = "剩余25:00",
                            color = Color.White,
                            fontSize = 18.sp
                        )
                        // 可以添加退出按钮(比如长按验证后退出)
                        Button(
                            onClick = onExit,
                            modifier = Modifier.padding(top = 32.dp)
                        ) {
                            Text("结束专注")
                        }
                    }
                }
            }
        }

        // 添加窗口到系统
        windowManager.addView(overlayView, layoutParams)

        // 会话结束时移除窗口
        onDispose {
            windowManager.removeView(overlayView)
        }
    }
}

二、更推荐:Android 12+ 系统级 Focus Mode

如果你的APP目标版本是Android 12(API 31)及以上,优先使用系统自带的Focus Mode(属于Digital Wellbeing API),这个方案无需悬浮窗权限,体验更贴合系统生态,用户接受度更高。

实现步骤:

  1. 添加依赖
    在build.gradle中引入Digital Wellbeing库:
implementation "com.google.android.libraries.digitalwellbeing:digitalwellbeing:1.1.0"
  1. 启动/结束专注模式
import com.google.android.libraries.digitalwellbeing.DigitalWellbeingManager
import java.time.Duration

// 启动25分钟专注会话,仅允许指定应用使用
fun startFocusSession(context: Context) {
    val wellbeingManager = DigitalWellbeingManager.from(context)
    if (wellbeingManager.isFocusModeAvailable) {
        // 指定专注期间允许使用的应用包名(留空则阻止所有非系统应用)
        val allowedApps = emptySet<String>()
        wellbeingManager.startFocusMode(allowedApps, Duration.ofMinutes(25))
    }
}

// 手动结束专注会话
fun stopFocusSession(context: Context) {
    val wellbeingManager = DigitalWellbeingManager.from(context)
    wellbeingManager.stopFocusMode()
}

注意:使用该API需要用户在系统设置中允许你的APP访问Digital Wellbeing数据,你需要引导用户完成授权。

三、不推荐:Device Policy Manager

该方案需要用户授予设备管理员权限,权限过于敏感,普通个人应用不建议使用,通常用于企业管理类APP。它可以强制限制应用启动,但会让用户产生不信任感,且卸载APP需要先取消管理员权限,体验不佳。


附Figma设计示例:
Figma示例图

内容的提问来源于stack exchange,提问作者Huyen Nguyen Thi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:13:16