如果使用Android后台服务,则Flutter卡在“等待天文台端口可用”上

2022-09-04 20:04:46

我一直在尝试为Flutter编写平台代码,以启动后台服务。在这里,我使用了一个最小的示例,没有实际工作来表明应用程序根本无法运行。实际的颤振代码根本不会修改。

主要活动.java

public class MainActivity extends FlutterActivity {

  Intent i = new Intent(this, MainService.class);

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  }
}

主要服务.java

public class MainService extends IntentService {
  public MainService() {
    super("MainService");
  }

  @Override
  protected void onHandleIntent(Intent Intent) {
  }
}

AndroidManifest.xml

 <service android:enabled="true"
android:name=".MainService"></service>

生成版本为 >27,清单文件相应地添加了标记。service

编译和运行 将显示以下消息:flutter run -v

..
[ +121 ms] Starting: Intent { act=android.intent.action.RUN flg=0x20000000 cmp=com.example.hello/.MainActivity (has extras)}
[   +1 ms] Waiting for observatory port to be available...

安装卡住了。

是否有解决此问题的方法?如果这是Flutter实现中的一个实际错误,这是否也意味着没有办法在后台运行Flutter应用程序?


答案 1

我遇到了这个问题,并最终将其追溯到我将项目的包名称更改为com.test的事实。AndroidManifest 中的 MyAppName。这不是有效的 Dart 包名称。您可以通过尝试使用以下命令创建新项目来验证这一点:

flutter create --org com.test MyAppName

这将导致错误消息:

“MyAppName”不是有效的 Dart 包名称。

Pubspec 格式说明中

用于包名称。lowercase_with_underscores

包名称应全部小写,并用下划线分隔单词 。仅使用基本的拉丁字母和阿拉伯数字:[a-z0-9_]。此外,请确保该名称是有效的 Dart 标识符 - 它不以数字开头,也不是保留字。just_like_this

对我来说,解决方案是通过运行来重新创建具有所需值的项目

flutter create --org com.test my_app_name

并跨 lib 文件夹、pubspec 文件、任何资产等进行复制。这应该可以解决问题。请注意,这会导致 kotlin 文件夹 (android/app/main/kotlin) 根据您指定的域正确设置子文件夹,例如 kotlin/com/test/ for com.test


答案 2

我遇到了同样的问题。在我的情况下解决了这个问题。对我来说,问题的原因是Android软件包中的重命名。重命名包后,您可能需要清理抖动的旧构建文件。flutter clean


推荐