从后台颤振隔离向Android方法发送平台消息

Posted

技术标签:

【中文标题】从后台颤振隔离向Android方法发送平台消息【英文标题】:Send platform message to Android method from background flutter isolate 【发布时间】:2019-05-31 13:51:17 【问题描述】:

我希望有一个 dart 后台服务永远运行(隔离),它将通过 websockets 与服务器通信。我有一个适用于 android 的 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);
    
        ·
        ·
        ·

MainActivityJava

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)

【问题讨论】:

请提供一些代码(到目前为止您所做的)以获得更好的响应 @MohamadArmoon 完成。感谢重播。我阅读了文章“使用 Flutter 插件和地理围栏在后台执行 Dart”,他们说对于后台执行我必须使用隔离。 【参考方案1】:

当应用程序处于垃圾中(应用程序关闭)时尝试运行 dart 代码时会发生此错误,到目前为止,处理后台服务的最佳方法是在本机代码中执行您需要的操作,并且不要尝试运行任何东西应用关闭时来自 dart。

【讨论】:

以上是关于从后台颤振隔离向Android方法发送平台消息的主要内容,如果未能解决你的问题,请参考以下文章

尝试向 Flutter 发送平台消息,但 FlutterJNI 与原生 C++ 分离。无法发送。频道:颤振/文本输入。响应 ID:0

Laravel Websocket 向特定的 Android 设备发送消息

颤振 - 用户打开推送通知消息(FCM)后如何执行任务

当 Apple Watch 处于后台状态或睡眠模式时,我们如何从 iphone 向 Apple Watch 发送消息?

从 Activity 向服务发送消息 - Android

在弹出窗口中从 iframe 向后台脚本发送消息