Flutter考勤Launcher App:后台保活及重启后NFC读取故障求助
问题描述
我开发了一款基于Flutter的NFC考勤应用,需要7*24小时持续运行,但运行7-14天后会被Android系统自动关闭。为此将应用设置为Launcher App,却出现重启后无法读取NFC的问题,系统提示无支持NFC的应用。
以下是AndroidManifest.xml中的相关配置:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> <data android:mimeType="*/*" /> </intent-filter>
使用的NFC读取包为flutter_nfc_kit
求助两个问题:
- 如何实现应用7*24小时后台保活?
- 如何解决Launcher App重启后NFC读取失效的问题?
解决方案
一、实现7*24小时后台保活
- 启用前台服务:Android 8.0+对后台进程限制严格,必须启动前台服务并显示低优先级通知(可设为折叠式,不干扰用户)。通过Flutter插件或原生代码实现,服务中调用
startForeground(),同时在Manifest中申请FOREGROUND_SERVICE权限。 - 加入电池白名单:申请
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,引导用户将应用添加到系统电池优化白名单,避免被系统因省电策略杀死。 - 监听系统广播:静态注册
BOOT_COMPLETED、PACKAGE_REPLACED广播,在设备重启或应用更新后自动重启服务。Android 13+需额外申请RECEIVE_BOOT_COMPLETED权限。 - 厂商适配:针对小米、华为、vivo等国内厂商,引导用户手动开启“允许后台活动”“无限制后台”,关闭“智能省电”“锁屏清理”等功能——这类厂商有独立的后台管理机制,通用方案无法覆盖。
- 优化内存占用:用Flutter DevTools排查内存泄漏,减少不必要的资源持有,避免因内存过高被系统回收。
二、解决Launcher App重启后NFC读取失效
- 完善TECH_DISCOVERED过滤器配置:当前的
TECH_DISCOVERED缺少指定支持的NFC技术类型,系统无法识别。需补充配置:- 在
res/xml目录创建nfc_tech_filter.xml:
<resources> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> <!-- 根据你的考勤标签类型添加对应技术 --> </tech-list> </resources>- 在Manifest的
TECH_DISCOVERED过滤器后添加meta-data:
<intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> - 在
- 补充更多NFC Intent过滤器:添加
NDEF_DISCOVERED和TAG_DISCOVERED,确保系统能匹配到应用:<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <data android:mimeType="text/plain" /> <!-- 匹配你的标签MIME类型 --> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> </intent-filter> - 确认NFC权限与特性声明:在Manifest中添加必要配置:
<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> - 重启后主动初始化NFC:在应用主入口(如首页
initState)调用flutter_nfc_kit的初始化方法,主动检查并启用NFC:@override void initState() { super.initState(); _initNFC(); } Future<void> _initNFC() async { final availability = await FlutterNfcKit.nfcAvailability; if (availability == NFCAvailability.available) { await FlutterNfcKit.startSession(); } else { // 提示用户开启NFC } } - 验证默认Launcher权限:切换为默认Launcher后,部分机型会重置应用权限,需引导用户确认NFC权限已授予。
内容的提问来源于stack exchange,提问作者abuder
相关产品推荐
相关产品推荐

