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
相关产品推荐
相关产品推荐

