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

锁屏状态下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:03:34