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无法触发锁屏唤醒,需在发送通知时指定全屏意图:
- 初始化通知插件:
final AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); await flutterLocalNotificationsPlugin.initialize(initializationSettings);
- 构建带全屏意图的通知:
// 构建启动目标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
相关产品推荐
相关产品推荐

