展厅演示应用:应用终止且手机闲置时如何自动重启?
展厅演示APP解决方案指南
核心结论
这类展厅场景的应用确实高度依赖平台原生系统能力,Flutter可以完成UI和业务逻辑部分,但系统级的后台保活、进程唤醒、跨应用活动监测必须结合原生代码实现,单纯靠Flutter插件很难稳定达标。
1. 后台保活与自动重启的实现
Android端
- 放弃单纯依赖flutter_background_service,改用原生前台服务(Foreground Service):
- 在
AndroidManifest.xml中声明FOREGROUND_SERVICE、WAKE_LOCK权限,注册自定义前台服务。 - 服务启动时必须调用
startForeground(),绑定一个持久通知(Android 8.0+强制要求),避免被系统轻易杀死。 - 配合
WorkManager或JobScheduler定时检查APP运行状态:如果检测到APP不在前台且用户已回到桌面,通过Intent启动你的演示APP。 - 针对国内ROM(小米、华为、OPPO等),必须引导用户将APP加入后台白名单,否则系统会强制杀死后台进程。
- 在
iOS端
- iOS对后台进程限制极严,无法实现类似Android的长期后台保活,建议结合系统自带的引导访问模式:
- 用户使用其他APP前退出引导访问,用完后重新开启,自动回到演示APP。
- 若必须自动重启,可通过
BackgroundTasks框架申请短暂后台执行时间,或者利用静默推送唤醒APP(需开发者账号配置推送证书)。
2. 跨应用活动监测的正确姿势
- flutter_accessibility_service只能在Flutter进程存活时工作,要实现APP关闭后的监测:
- Android端:开发原生Accessibility Service,独立于Flutter进程运行,监听系统窗口变化。当监测到用户退出其他应用回到桌面时,发送广播或直接启动演示APP。
- iOS端:可通过
NotificationCenter监听UIApplicationDidEnterBackgroundNotification和UIApplicationDidBecomeActiveNotification,但同样受后台限制,仅能在APP短暂后台存活时触发。
3. Flutter的合理分工
Flutter专注于演示逻辑与UI:比如自动轮播手机功能、展示交互效果等。系统级操作(后台保活、进程唤醒、活动监测)通过MethodChannel交给原生层处理,Flutter只负责接收原生的触发信号,重启演示流程。
4. flutter_background_service报错的临时排查
- 检查
AndroidManifest.xml权限与服务注册是否完整,确保添加了前台服务权限和正确的服务声明。 - 确认服务启动时调用了
startForeground(),并创建了合法的通知渠道(Android 8.0+要求)。 - 尝试降级插件到稳定版本,或查看插件GitHub Issues,很多报错是版本兼容或系统权限配置问题。
内容的提问来源于stack exchange,提问作者Muhtar
相关产品推荐
相关产品推荐

