我想让dart后台服务永远运行(隔离),该服务将通过websocket与服务器通信。我有一个适用于Android的API,该API收集信息以发送到服务器。 我该如何调用使用回调的Android方法以及背景中隔离的所有内容?
编辑
到目前为止,即使用户正在使用其他应用程序或屏幕已关闭,我仍在dart中创建了一个Isolate来定期在后台调用poolSong方法。
但是这给了我下面的错误...关于github问题,他们说我不能从其他Isolate发送平台消息,除非它是主要消息。但是,如果我是从主隔离区执行此操作的,则当用户退出应用程序时,隔离区也会终止。
class _MyHomePageState extends State<MyHomePage> {
final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
static const platform = const MethodChannel('mainService');
static _poolSong(SendPort sendPort) async {
const oneSec = const Duration(seconds:1);
new Timer.periodic(oneSec, (Timer t) => platform.invokeMethod('poolSong'));
}
@override
void initState() {
super.initState();
ReceivePort receivePort = ReceivePort();
Isolate.spawn(_poolSong, receivePort.sendPort);
}
·
·
·
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
(call, result) -> {
if (call.method.equals("startService"))
startService();
if (call.method.equals("poolSong"))
poolSong();
}
);
}
E/flutter (25412): [ERROR:flutter/runtime/dart_isolate.cc(717)] Isolate (765499726) 'main.dart:_poolSong()' exited with an error
E/flutter (25412): [ERROR:flutter/shell/common/shell.cc(186)] Dart Error: Unhandled exception:
E/flutter (25412): error: native function 'Window_sendPlatformMessage' (4 arguments) cannot be found
E/flutter (25412): #0 Window.sendPlatformMessage (dart:ui/window.dart:811:9)
E/flutter (25412): #1 BinaryMessages._sendPlatformMessage (package:flutter/src/services/platform_messages.dart:39:15)
E/flutter (25412): #2 BinaryMessages.send (package:flutter/src/services/platform_messages.dart:87:12)
E/flutter (25412): #3 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:286:49)
E/flutter (25412): <asynchronous suspension>
E/flutter (25412): #4 _MyHomePageState._poolSong.<anonymous closure> (package:musictie/main.dart:37:54)
E/flutter (25412): #5 _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:382:19)
E/flutter (25412): #6 _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5)
E/flutter (25412): #7 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
答案 0 :(得分:1)
当应用程序处于垃圾箱(应用程序关闭)中时尝试运行dart代码时,会发生此错误,到目前为止,处理后台服务的最佳方法是执行本机代码中所需的操作,而不尝试运行任何操作在应用关闭时从dart中退出。
答案 1 :(得分:0)
在阅读famous article并解释了如何在后台使用后台服务并意识到这非常荒唐之后,我注意到我所有的Android代码都可以使用JS版本的API直接用javascript编写。 / p>
因此,使用interactive_webview插件进行抖动,我会将所有android代码转换为js ...就这样。我不再担心为iOS和Android编写特定的平台代码。加上flutter应用程序默认在后台运行(我想)。