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

透明Activity遮挡下层交互问题及非Activity实现方案咨询

问题解答:锁屏/来电场景下透明UI的交互问题

一、透明Activity无法穿透触摸的核心原因与解决办法

你猜的没错,下层电话应用Activity处于onPause/onStop状态是核心原因——因为Android的Activity栈机制,当你的透明Activity成为前台焦点时,系统会自动暂停栈中下层的Activity,自然无法响应触摸。

之前的设置没生效,是因为只加了部分必要参数,正确的组合应该是:

  1. 给透明Activity的Window添加两个关键Flag,确保它不抢占焦点、不拦截触摸:
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    
    这俩Flag配合,触摸事件会直接透传到下层的电话应用,你的Activity只负责显示,完全不参与交互逻辑。
  2. 确保Activity主题是完全透明的,避免因窗口属性导致的隐性拦截:
    <style name="TransparentCallOverlayTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>
    

二、不使用Activity的实现方案(替代废弃的FLAG_SHOW_WHEN_LOCKED)

可以继续用WindowManager实现,适配新API即可:

  1. 先申请必要权限:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    
    注意:Android 6.0+需要引导用户手动开启「显示在其他应用上层」权限(跳转Settings.ACTION_MANAGE_OVERLAY_PERMISSION)。
  2. 创建悬浮View的LayoutParams,用官方推荐的新类型替代旧的窗口类型:
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT,
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? 
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : 
            WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
        PixelFormat.TRANSLUCENT
    );
    
  3. 适配锁屏显示(Android 10+):
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        overlayView.getWindowInsetsController().setShowWhenLocked(true);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        // 针对旧版本,需要通过WindowManager的辅助方法设置
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    }
    
    这种方案的悬浮View不会抢占系统电话应用的焦点,触摸自然能透传。

三、来电场景的特殊优化

如果坚持用透明Activity,除了上面的Flag设置,还要注意:

  • 不要给Activity设置singleTask/singleInstance的启动模式,避免抢占电话应用的栈顶位置;
  • 在来电广播触发时立即启动Activity,不要延迟,防止系统提前锁定电话应用的焦点;
  • 若还是有问题,优先切换到WindowManager悬浮View方案——它的优先级低于系统电话应用,不会干扰电话的交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:40:09