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

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

求助两个问题:

  1. 如何实现应用7*24小时后台保活?
  2. 如何解决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技术类型,系统无法识别。需补充配置:
    1. 在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>
    
    1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:18:15