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

时间:2018-12-18 10:25:05

标签: java android dart flutter

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

MainActivity.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);
  }
}

MainService.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>

buildVersion为> 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应用程序的方法?

9 个答案:

答案 0 :(得分:5)

我遇到了这个问题,并最终将其归结为以下事实:我已在AndroidManifest中将项目的程序包名称更改为com.test。 MyAppName 。这不是有效的Dart软件包名称。您可以通过尝试使用

创建一个新项目来验证这一点

flutter create --org com.test MyAppName

这将导致错误消息:

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

来自Pubspec format description

DO 使用lowercase_with_underscores作为软件包名称。

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

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

flutter create --org com.test my_app_name

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

答案 1 :(得分:2)

如果您遇到这种情况并且使用Firebase,请尝试从Firebase控制台下载并插入“ google-services.json”文件的新副本。此外,请确保您遵循Add Firebase to your Flutter App文档中列出的所有步骤。

如果您还为此启用了Crashlytics,请确保已在Firebase控制台中启用了它,并遵循了Get Started with Firebase Crashlytics文档中列出的其他说明。

我不确定这些问题中的哪一个解决了我的问题,但是直到我检查了这两个文档中列出的所有步骤之后,其他任何方法都无法起作用。

答案 2 :(得分:1)

重现此问题的另一种方法是将AndroidManifest中应用程序的android:name属性从io.flutter.app.FlutterApplication的默认值更改为其他值(在我的示例com.test.my_app_name中)。由flutter创建的标准AndroidManifest中的注释中详细介绍了此属性的用途:

 <!-- io.flutter.app.FlutterApplication is an android.app.Application
      that calls FlutterMain.startInitialization(this); in its onCreate
      method. In most cases you can leave this as-is, but you if you want 
      to provide additional functionality it is fine to subclass or
      reimplement FlutterApplication and put your custom class here. -->

因此,除非要使用您自己的自定义类,否则不要更改该值-这不仅仅是标签。

答案 3 :(得分:1)

此问题的另一个潜在原因是MainActivity.kt中指定的软件包格式错误,它还应使用相同的有效Dart软件包名称,例如

package com.test.my_app_name

代替

package com.test.MyAppName

答案 4 :(得分:1)

首先检查两个名字是否相同:

  • android/app/src/mainAndroidManifest.xml 中的包名
  • android/app/main/kotlin/MainActivity.kt 中的包名

然后,检查 iOS 包名称是否与包名称相似。例如:

  • iOS 包名称:com.example.myAppName
  • 包名称:com.example.my_app_name

最后,检查 Firebase iOS 应用程序包 ID 的名称是否与 iOS 包名称相同。

在 Firebase 中:

在 Xcode 中:

答案 5 :(得分:0)

我有同样的问题。就我而言,flutter clean解决了该问题。对我来说,造成问题的原因是Android包中的重命名。重命名该软件包后,您可能需要清除旧的旧构建文件。

答案 6 :(得分:0)

我遇到了同样的问题,并通过在我的应用级构建文件(例如enter image description here)中包含所有支持平台来解决它

答案 7 :(得分:0)

@david-conlisk 's answer之后,您还可能:

  • 重命名了Kotlin软件包,而不更新软件包行;

  • 从另一个类/项目复制了MainActivity代码,但是 忘记更新包裹行

所有这些情况都可能导致相同的挂起和崩溃。

恕我直言,Android Studio应该远离当前的文本文件编辑地狱,并提供类似于Xcode或VisualStudio的多合一项目配置UI。需要编辑多个Gradle配置文件以及Android自己的属性页为错误留下了太多的空间。

答案 8 :(得分:0)

此问题的根本原因之一是 ADB 命令中的错误,即使显示应用的 ADB 不存在,某些与应用相关的进程仍在后台运行。 此行为的解决方法是从 ADB 运行卸载:

adb  -s  <deviceID> uninstall <com.example.appname>