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

Android Studio SDK30后台启动Activity覆盖其他应用出现黑屏问题

适配API 30后台弹出锁屏Activity黑屏修复方案

1 核心问题原因

你遇到的黑屏是Android 10(API 29)及以上版本的后台Activity启动限制导致的,仅申请SYSTEM_ALERT_WINDOW权限不足以满足要求,同时启动Intent缺少必要配置、前台监听逻辑上下文异常也会导致该问题。

2 修复步骤

2.1 权限校验与动态申请

首先确认所有特殊权限已经被用户手动授予:

  • PACKAGE_USAGE_STATS:需要引导用户到「设置-应用-特殊应用权限-使用情况访问权限」中开启对应权限
  • 悬浮窗权限:你申请的两个权限都需要,其中ACTION_MANAGE_OVERLAY_PERMISSION是动态申请用的Action,不是静态权限,需要用以下代码主动申请,引导用户到「设置-应用-特殊应用权限-显示在其他应用上层」开启权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1001);
}

2.2 给启动Intent添加必要Flag

后台启动Activity需要额外配置任务栈相关Flag,否则会找不到渲染容器导致黑屏,修改启动LockScreen的代码:

Intent i = new Intent(getApplicationContext(),LockScreen.class);
// 新增以下Flag
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    i.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
}
startActivity(i);

2.3 配置LockScreen的Activity属性

在AndroidManifest.xml中给LockScreen对应的activity标签添加适配上层显示的配置:

<activity
    android:name=".LockScreen"
    android:exported="false"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:showOnLockScreen="true"
    android:turnScreenOn="true"/>

2.4 修复监听逻辑的线程问题

你当前的while循环写在主线程中,应用切后台后主线程会被系统挂起,且MainActivity上下文可能失效,先临时改成子线程运行测试效果:

public void startListening(View view) {
    System.out.println("Lock activated.");
    activated = true;
    // 放到子线程运行,避免阻塞主线程+后台被挂起
    new Thread(() -> {
        while (activated) {
            String currentlyRunningApp = getCurrentApp();
            if (currentlyRunningApp.equals("com.whatsapp")) {
                System.out.println("Whatsapp detected. Showing Lockscreen...");
                Intent i = new Intent(getApplicationContext(),LockScreen.class);
                // 加入上面提到的Flag
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    i.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
                }
                startActivity(i);
            }
            try {
                Thread.sleep(800);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

完成以上修改后,确认两个特殊权限都已授予,即可解决后台弹出黑屏的问题。后续你可以再将监听逻辑迁移到前台Service,避免进程被系统回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:15:04