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

Flutter Android应用main函数执行两次问题咨询

问题产生原因

main函数执行两次和你使用的计数器示例代码无关,是Android端组件运行机制导致的正常现象:

  • 你在AndroidManifest.xml中注册了io.wazo.callkeep.VoiceConnectionService系统通话服务,当系统绑定该服务处理来电相关流程时,会启动新的Dart运行环境初始化Flutter引擎,自动触发main函数执行。
  • 后续如果接入Firebase云消息的后台推送接收、其他后台Flutter任务,同样会在独立的后台isolate中执行main函数,这是Flutter Android嵌入层的默认设计,不属于代码bug。
修复方案

根据你的实际需求选以下方案即可:

  • 方案1:进程判断隔离逻辑
    在main函数开头判断当前是否为主UI进程,仅在主进程执行runApp和主业务初始化,后台进程按需处理对应逻辑即可,示例代码:

    import 'package:flutter/material.dart';
    
    void main() {
      // 非主UI进程直接拦截,不加载主应用
      if (WidgetsBinding.instance.lookupBoundary<RenderView>() == null) {
        debugPrint('后台服务进程启动,跳过主界面加载');
        // 如需处理后台任务(如来电、推送)可在此处写对应初始化逻辑
        return;
      }
      debugPrint('主进程启动');
      runApp(const MyApp());
    }
    

    注意不要把全局单例初始化、数据库打开、登录态校验这类只能在主进程执行一次的逻辑裸写在main最外层,避免后台进程启动时触发资源冲突、数据重复写入问题。

  • 方案2:给后台服务配置独立进程
    修改Manifest中通话服务的配置,增加android:process属性将服务放到独立进程运行,避免和主进程共享运行时:

    <service 
        android:name="io.wazo.callkeep.VoiceConnectionService"
        android:exported="true"
        android:label="Wazo"
        android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
        android:process=":callkeep_background"
        tools:ignore="IntentFilterExportedReceiver">
        <intent-filter android:exported="true">
            <action android:name="android.telecom.ConnectionService" />
        </intent-filter>
    </service>
    

    配置后服务会运行在com.app.chat:callkeep_background独立进程下,你在日志控制台过滤主进程日志,就不会看到重复的main打印。

  • 方案3:日志过滤
    如果不需要处理后台服务逻辑,直接在开发工具的日志面板过滤主进程输出即可,无需修改代码。

内容的提问来源于stack exchange,提问作者Bilal Rabbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:03:49