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

Android锁屏/解锁时控制无障碍服务Widget显隐方案咨询

实现锁屏显示Widget、解锁隐藏Widget的无障碍服务方案

核心问题分析

  1. 仅通过KeyguardManager单次判断锁屏状态,无法实时响应状态变化,导致解锁后窗口状态未更新
  2. 无障碍服务属于系统托管组件,调用stopService()无法终止服务,系统会自动重启,因此不应通过启停服务实现需求,而是直接控制窗口的显示/隐藏

一、配置WindowManager参数适配锁屏显示

创建窗口时必须设置正确的类型和Flag,确保能在锁屏界面显示,同时不影响正常解锁操作:

private val layoutParams by lazy {
    WindowManager.LayoutParams().apply {
        // 适配Android版本的窗口类型
        type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            WindowManager.LayoutParams.TYPE_PHONE
        }
        // 关键Flag:允许锁屏显示、不抢占焦点、支持解锁时隐藏
        flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
                WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
        width = WindowManager.LayoutParams.WRAP_CONTENT
        height = WindowManager.LayoutParams.WRAP_CONTENT
        gravity = Gravity.CENTER
        format = PixelFormat.TRANSLUCENT
    }
}

二、实时监听锁屏/解锁状态

通过动态注册系统广播,监听ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT事件,实时更新窗口状态:

private lateinit var screenStateReceiver: BroadcastReceiver
private lateinit var windowManager: WindowManager
private lateinit var widgetView: View

override fun onServiceConnected() {
    super.onServiceConnected()
    windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    widgetView = LayoutInflater.from(this).inflate(R.layout.your_widget_layout, null)
    
    // 初始状态判断:锁屏则显示窗口
    val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
    if (keyguardManager.isKeyguardLocked) {
        showWidgetWindow()
    }
    
    // 注册状态监听广播
    registerScreenReceiver()
}

private fun registerScreenReceiver() {
    screenStateReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (intent?.action) {
                Intent.ACTION_SCREEN_OFF -> showWidgetWindow()
                Intent.ACTION_USER_PRESENT -> hideWidgetWindow()
                Intent.ACTION_SCREEN_ON -> {
                    val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
                    if (keyguardManager.isKeyguardLocked) showWidgetWindow() else hideWidgetWindow()
                }
            }
        }
    }
    val filter = IntentFilter().apply {
        addAction(Intent.ACTION_SCREEN_OFF)
        addAction(Intent.ACTION_SCREEN_ON)
        addAction(Intent.ACTION_USER_PRESENT)
    }
    registerReceiver(screenStateReceiver, filter)
}

override fun onDestroy() {
    super.onDestroy()
    unregisterReceiver(screenStateReceiver)
    removeWidgetWindow()
}

三、窗口显示/隐藏控制逻辑

直接通过WindowManager添加/移除View实现状态切换,避免操作服务生命周期:

private fun showWidgetWindow() {
    try {
        if (widgetView.parent == null) {
            windowManager.addView(widgetView, layoutParams)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

private fun hideWidgetWindow() {
    try {
        if (widgetView.parent != null) {
            windowManager.removeView(widgetView)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

private fun removeWidgetWindow() {
    try {
        if (widgetView.parent != null) {
            windowManager.removeViewImmediate(widgetView)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

四、无障碍服务配置要求

在AndroidManifest.xml中正确声明服务,并配置必要的权限:

<service
    android:name=".YourAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

res/xml/accessibility_service_config.xml配置示例:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_service_description" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:15:46