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

Flutter技术问题:锁屏状态下如何唤醒屏幕并显示内容?

锁屏唤醒屏幕并显示Flutter界面的解决方案

一、补全Android权限与Manifest配置

你现有的配置存在关键遗漏,需按以下方式调整:

  • 注意android:showOnLockScreen在Android 10(API 29)后已废弃,仅保留android:showWhenLocked和android:turnScreenOn即可;必须添加USE_FULL_SCREEN_INTENT权限,这是锁屏唤醒全屏界面的核心权限;Android 13+还需申请POST_NOTIFICATIONS通知权限。
  • 给目标Activity添加launchMode="singleTop",避免重复创建实例。

修正后的Manifest配置示例:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<!-- Android 13+ 必备通知权限 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<application ...>
    <activity
        android:name=".MainActivity"
        android:showWhenLocked="true"
        android:turnScreenOn="true"
        android:excludeFromRecents="true"
        android:launchMode="singleTop">
        ...
    </activity>
</application>

二、调整Local Notifications配置

仅靠Manifest无法触发锁屏唤醒,需在发送通知时指定全屏意图:

  1. 初始化通知插件:
final AndroidInitializationSettings initializationSettingsAndroid =
    AndroidInitializationSettings('@mipmap/ic_launcher');
final InitializationSettings initializationSettings =
    InitializationSettings(android: initializationSettingsAndroid);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
  1. 构建带全屏意图的通知:
// 构建启动目标Activity的意图
final AndroidIntent intent = AndroidIntent(
  action: 'android.intent.action.MAIN',
  packageName: 'com.your.package.name', // 替换为你的包名
  className: 'com.your.package.name.MainActivity', // 替换为目标Activity路径
);
final PendingIntent pendingIntent =
    AndroidPendingIntent.getActivity(
  context,
  0,
  intent,
  PendingIntentFlags.updateCurrent | PendingIntentFlags.immutable,
);

// 设置全屏意图
final FullScreenIntent fullScreenIntent = FullScreenIntent(
  pendingIntent,
  isForegroundService: false,
);

// 配置通知详情,必须设置高优先级
final AndroidNotificationDetails androidNotificationDetails =
    AndroidNotificationDetails(
  'lock_screen_channel', // 自定义渠道ID
  '锁屏通知渠道', // 自定义渠道名称
  channelDescription: '用于锁屏唤醒的通知渠道',
  importance: Importance.max,
  priority: Priority.high,
  fullScreenIntent: fullScreenIntent,
  wakeUpScreen: true,
);
final NotificationDetails notificationDetails =
    NotificationDetails(android: androidNotificationDetails);

// 发送通知
await flutterLocalNotificationsPlugin.show(
  0,
  '紧急通知',
  '点击查看详情',
  notificationDetails,
);

三、Flutter端处理唤醒后的界面

若要直接显示指定Scaffold页面,可通过Intent参数判断启动来源,跳转至目标页面:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 获取启动Intent,判断是否来自锁屏通知
  final Intent? launchIntent = await AndroidIntent.receiveIntent();
  runApp(MyApp(isFromLockScreen: launchIntent != null));
}

class MyApp extends StatelessWidget {
  final bool isFromLockScreen;

  const MyApp({super.key, required this.isFromLockScreen});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: isFromLockScreen ? const LockScreenScaffold() : const HomePage(),
    );
  }
}

class LockScreenScaffold extends StatelessWidget {
  const LockScreenScaffold({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('锁屏唤醒页面')),
      body: const Center(child: Text('这是锁屏状态下显示的内容')),
    );
  }
}

四、关键注意事项

  • Android 9及以下需动态申请WAKE_LOCK权限,Android 10+该权限自动授予;
  • 通知渠道必须设置为最高优先级(Importance.max),否则系统会限制锁屏唤醒;
  • 若由后台服务触发通知,Android 8+需将服务设为前台服务,避免被系统静默限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:10:31