【Flutter】Flutter 进程保活 ③ ( 屏幕常亮设置 | Flutter 禁止息屏、关闭自动锁屏、屏蔽系统屏保 )

文章目录

  • [一、Flutter 屏幕常亮需求](#一、Flutter 屏幕常亮需求)
  • [二、使用 wakelock_plus 插件开发 Flutter 屏幕常亮功能](#二、使用 wakelock_plus 插件开发 Flutter 屏幕常亮功能)
    • [1、wakelock_plus 插件介绍](#1、wakelock_plus 插件介绍)
    • [2、引入 wakelock_plus 依赖](#2、引入 wakelock_plus 依赖)
    • [3、wakelock_plus 插件对应的不同平台配置](#3、wakelock_plus 插件对应的不同平台配置)
    • [4、wakelock_plus 插件基础用法代码](#4、wakelock_plus 插件基础用法代码)
    • [5、wakelock_plus 插件监听单个页面的生命周期](#5、wakelock_plus 插件监听单个页面的生命周期)
    • [6、wakelock_plus 插件监听 APP 应用前后台变化](#6、wakelock_plus 插件监听 APP 应用前后台变化)
    • [7、wakelock_plus 插件开发注意事项](#7、wakelock_plus 插件开发注意事项)
    • 章节总结
  • [三、Android 开发配置](#三、Android 开发配置)

参考文档 :

一、Flutter 屏幕常亮需求


1、业务场景

日常 Flutter 开发中 , 很多业务场景需要 APP 页面 长期保持屏幕常亮 , 不自动变暗、不进入息屏、不触发系统屏保 :

  • 视频播放、直播投屏页面
  • 车载设备、工业平板控制终端
  • 扫码开票、设备巡检长驻页面
  • 实时数据监控、WebSocket设备状态大屏
  • 阅读器、文档长浏览页面

Flutter 自带没有屏幕常亮API ;

Flutter 是纯 UI 框架 , 无法直接操作系统底层电源、锁屏权限 ;

屏幕息屏 / 锁屏是安卓、iOS原生系统电源管理机制 , Flutter 只能通过成熟第三方插件调用原生系统唤醒锁实现 ;

2、底层核心原理

手机/平板系统默认搭载电源省电策略 : 设备无触摸操作一段时间后 , 自动降低屏幕亮度→屏幕变暗→关闭屏幕 ( 息屏 ) →启动系统屏保→设备锁屏 , 降低设备功耗 ;

  • 屏幕变暗 : 系统自动降低屏幕亮度 ( 常亮可禁止 )
  • 屏幕息屏 : 屏幕黑屏关闭 ( 常亮可禁止 )
  • 系统屏保 : 闲置后弹出屏保画面 ( 常亮可禁止 )
  • 设备锁屏 : 触发密码/指纹锁屏 ( 常亮可禁止 )
  • 后台保活 : 屏幕常亮 不能 保证APP退后台不被杀进程 , 仅控制屏幕硬件状态 ;

安卓、iOS、Windows、鸿蒙全平台底层都提供 WakeLock ( 电源唤醒锁 ) 系统能力 :

  • 应用申请持有唤醒锁后 , 会向系统电源管理器发送常驻保活指令 ;
  • 系统强制终止当前APP页面的自动休眠、变暗、屏保、锁屏逻辑 , 直到代码主动释放唤醒锁 ;

使用 Flutter 屏幕常亮插件 wakelock_plus , 本质工作 :

  • Flutter层调用插件方法
  • 插件桥接调用 Android/iOS 原生系统API
  • 原生申请/释放 WakeLock 唤醒锁
  • 控制系统屏幕休眠策略

二、使用 wakelock_plus 插件开发 Flutter 屏幕常亮功能


1、wakelock_plus 插件介绍

wakelock_plus 插件 是 Flutter 社区官方维护的跨平台屏幕唤醒锁插件 , 支持 Android / iOS / MacOS / Windows / Linux / Web ; 适配 Flutter3.0+ 全部新版本 ;

2、引入 wakelock_plus 依赖

pubspec.yaml 引入依赖 :

shell 复制代码
dependencies:
  wakelock_plus: ^1.6.1 # 截止2026最新稳定版本

终端执行拉取依赖 :

shell 复制代码
flutter pub get

3、wakelock_plus 插件对应的不同平台配置

wakelock_plus 插件对应的不同平台配置 :

  • Android : 无需手动配置权限 , 插件内部自动注册
  • iOS : 零配置 , 直接使用
  • 桌面/Web : 零配置 , 系统原生API直接调用

4、wakelock_plus 插件基础用法代码

wakelock_plus 插件基础用法代码 : 单行代码开关屏幕常亮 ;

dart 复制代码
import 'package:wakelock_plus/wakelock_plus.dart';

// 1. 开启屏幕常亮 ------ 禁止息屏、屏保、自动锁屏
await WakelockPlus.enable();

// 2. 关闭屏幕常亮 ------ 恢复系统默认省电策略
await WakelockPlus.disable();

// 3. 查询当前是否处于常亮状态
bool isKeepAlive = await WakelockPlus.isEnabled;

以上三行代码 , 即可实现全局屏幕不息屏!

5、wakelock_plus 插件监听单个页面的生命周期

直接调用 WakelockPlus.enable() 代码 , 退出应用时如果没有 WakelockPlus.disable() 关闭 , 则出现 :

  • 退出当前页面 , 全局手机一直常亮 , 手机无法锁屏 , 异常耗电
  • APP退到后台仍然保持唤醒 , 系统弹窗警告耗电异常
  • 页面重复开启关闭 , 状态错乱
    正确开发规范 : 跟随页面/APP生命周期自动控制常亮状态

代码示例如下 :

dart 复制代码
import 'package:flutter/material.dart';
import 'package:wakelock_plus/wakelock_plus.dart';

class MonitorPage extends StatefulWidget {
  const MonitorPage({super.key});

  @override
  State<MonitorPage> createState() => _MonitorPageState();
}

class _MonitorPageState extends State<MonitorPage> {
  @override
  void initState() {
    super.initState();
    // 页面初始化 : 开启屏幕常亮 , 禁止息屏屏保
    WakelockPlus.enable();
  }

  @override
  void dispose() {
    // 核心 : 页面销毁 , 立刻关闭常亮 , 归还系统电源权限
    WakelockPlus.disable();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('设备监控(屏幕常亮)')),
      body: const Center(child: Text('当前页面永不自动息屏')),
    );
  }
}

6、wakelock_plus 插件监听 APP 应用前后台变化

APP前台页面常亮 , 退后台自动关闭常亮省电 , 结合 WidgetsBindingObserver 监听应用生命周期 :

dart 复制代码
class _MonitorPageState extends State<MonitorPage> with WidgetsBindingObserver{
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    WakelockPlus.enable();
  }

  // 监听APP生命周期变化
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch(state){
      // APP前台运行 : 开启常亮
      case AppLifecycleState.resumed:
        WakelockPlus.enable();
        break;
      // APP退后台、弹窗覆盖 : 关闭常亮省电
      case AppLifecycleState.paused:
      case AppLifecycleState.inactive:
        WakelockPlus.disable();
        break;
      default: break;
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    WakelockPlus.disable();
    super.dispose();
  }
}

7、wakelock_plus 插件开发注意事项

wakelock_plus 插件开发注意事项 :

  • 忘记 disable 关闭唤醒锁 :
    • 只调用 enable() 不关闭 : APP退出、页面关闭后 , 手机永久无法自动息屏 ; 用户手机耗电飙升 , 应用商店审核不通过 ;
    • 解决方案 : initState 开启、dispose/onClose 强制关闭
  • 使用废弃 wakelock 原始插件 : 原始 wakelock 停止维护 , Flutter3.3+编译报错、iOS平台失效 ; 全部替换为 wakelock_plus ;
  • 屏幕常亮≠后台保活 : 很多开发者混淆概念 , 屏幕常亮仅仅控制屏幕硬件不黑屏 , 无法防止APP退后台被系统杀死进程 ; 后台保活需要单独配置原生后台权限 ;
  • 系统省电模式失效问题 : 手机开启【超级省电/极限省电模式】时 , 系统强制剥夺APP唤醒锁权限 , 常亮功能失效 ; 属于系统级限制 , APP代码无法绕过!

章节总结

1、Flutter 无 原生息屏控制API , 底层依靠 系统 WakeLock 唤醒锁 实现屏幕常亮 ;

2、生产环境优先 wakelock_plus 插件 , 全平台零配置、开发效率最高 ;

3、核心开发准则 : 页面进入开启、页面销毁关闭、后台自动关闭 , 杜绝耗电异常 ;

4、区分 屏幕常亮 和 进程后台保活 , 避免业务需求理解偏差 ;

5、系统 省电模式 会强制失效该功能 , 属于正常系统限制 ;

三、Android 开发配置


本章节内容 , 仅做参考 , 如果报错时 , 考虑手动添加如下内容 ;

1、添加权限

Android平台必须添加对应系统权限 , 否则无法弹出授权弹窗 , 在 android/app/src/main/AndroidManifest.xml 中配置如下 权限 ;

xml 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- 屏幕常亮权限 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

</manifest>

2、Activity 代码

kt 复制代码
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import android.view.WindowManager

class MainActivity : FlutterActivity(){
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}
相关推荐
心中有国也有家1 小时前
AtomGit Flutter 鸿蒙客户端:情绪日记的时间线实现
学习·flutter·华为·harmonyos
爱笑鱼2 小时前
NDK、SDK、APP、Framework、Native 到底怎么区分?
android
西西学代码2 小时前
Flutter---Container
flutter
西西学代码2 小时前
Flutter---底部导航栏(2)
开发语言·javascript·flutter
私人珍藏库2 小时前
[Android] 发票制作器-内置多行业专业模板
android·人工智能·app·软件·多功能
悲凉的紫菜4 小时前
dariy
android·ide·android studio
浮江雾4 小时前
Flutter第二节----Dart中的常量与变量
开发语言·前端·javascript·flutter·入门
2501_915909064 小时前
IPA 深度混淆是什么意思?从混淆强度到实际效果的解读
android·ios·小程序·https·uni-app·iphone·webview
yuanlaile5 小时前
前端转 Flutter 踩坑实录:一套可落地 Flutter 鸿蒙 App 完整学习路线,建议收藏!
flutter·harmonyos·flutter开发鸿蒙·跨平台开发app·flutter深入学习