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
相关产品推荐
相关产品推荐

