锁屏状态下Flutter应用触发指定页面显示的可行性与实现方案问询
锁屏状态下Flutter触发页面跳转的解决方案
可行性说明
完全可行,但需要针对Android系统的锁屏机制做特殊配置和权限申请——Android默认会限制后台进程在锁屏状态下启动Activity,通过配置权限和Intent标记即可绕过限制。
具体实现步骤
1. 配置Android权限与Activity属性
在android/app/src/main/AndroidManifest.xml中添加以下配置:
- 申请必要权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- 给目标Activity添加锁屏相关属性:
<activity android:name=".MainActivity" android:showWhenLocked="true" android:turnScreenOn="true" android:excludeFromRecents="true"> <!-- 保留原有Activity配置 --> </activity>
2. 调整Intent启动标记
修改openAppWithStartCall函数,给Intent添加锁屏相关启动标记,确保能直接在锁屏状态下唤起页面:
import 'package:android_intent_plus/android_intent_plus.dart'; import 'package:android_intent_plus/src/flags.dart'; openAppWithStartCall(String phone, int duration) async { debugPrint('Action:android.intent.action.whenNewCall'); AndroidIntent intent = AndroidIntent( action: 'android.intent.action.whenNewCall', package: 'com.example.flutter_application_1', data: Uri.encodeFull( 'MyApplicationId://search?phone=$phone&duration=$duration'), flags: [ Flag.FLAG_ACTIVITY_NEW_TASK, Flag.FLAG_SHOW_WHEN_LOCKED, Flag.FLAG_TURN_SCREEN_ON, Flag.FLAG_DISMISS_KEYGUARD, ], ); await intent.launch(); }
3. 确保后台回调稳定性
如果来电监听回调在锁屏时无法触发,需提升后台任务优先级:
- 用Foreground Service包裹来电监听逻辑,避免被系统后台回收;
- 针对Android 12及以上版本,确保申请
POST_NOTIFICATIONS权限,满足前台服务的通知显示要求。
注意事项
- Android 10(API 29)及以上版本,
FLAG_DISMISS_KEYGUARD仅能解除滑动锁,无法直接解锁密码锁;若需处理密码锁,需引导用户开启应用的"悬浮窗权限"; - 所有配置需在真实设备上测试,模拟器的锁屏行为可能与真实设备存在差异;
- 避免滥用锁屏唤起功能,否则可能被系统判定为恶意应用,影响应用上架或用户体验。
内容的提问来源于stack exchange,提问作者Alikheiri
相关产品推荐
相关产品推荐

