【问题标题】:How to call MethodChannel from an isolate created by android_alarm_manager?如何从 android_alarm_manager 创建的隔离中调用 MethodChannel?
【发布时间】:2026-02-14 23:00:02
【问题描述】:

我尝试安排后台服务。为此,我使用了https://pub.dev/packages/android_alarm_manager。效果很好。

对于我的示例,我尝试从我的隔离(android_alarm_manager 的回调)中获取颤振教程之后的电池电量:https://flutter.dev/docs/development/platform-integration/platform-channels?tab=android-channel-java-tab

如果我手动调用我的回调它会起作用(所以我很好地完成了 Android 部分)。如果 android_alarm_manager 调用它,我会出现以下错误:

Unhandled Exception: MissingPluginException(No implementation found for method getBatteryLevel on channel net.example.com/battery)

这很奇怪,因为在我使用https://pub.dev/packages/flutter_downloader 下载文件的另一个隔离区中,这个插件使用了 MethodChannel...

这是我的 android_alarm_manager 代码:

import 'package:flutter/services.dart';

class AndroidManagerCallBack {
  static Future<void> main() async {
    _AndroidManagerCallBack test = _AndroidManagerCallBack();
    await test.getBatteryLevel();
  }
}

class _AndroidManagerCallBack {
  static const platform = const MethodChannel('net.example.com/battery');

  Future<void> getBatteryLevel() async {
    String batteryLevel;
    try {
      final int result = await platform.invokeMethod('getBatteryLevel');
      batteryLevel = 'Battery level at $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }
    print(batteryLevel);
  }
}

我只是像这样调用回调:

AndroidAlarmManager.periodic(
      Duration(seconds: 20),
      0,
      AndroidManagerCallBack.main(),
      rescheduleOnReboot: true,
      wakeup: false,
    );

在 android_alarm_manager 的回调中,我可以调用使用 somee MethodChannel 的插件,但是当我尝试使用 MethodChannel 时,我得到了错误...

有人可以指导我:) ?

【问题讨论】:

    标签: android flutter flutter-plugin dart-isolates


    【解决方案1】:

    通过isolate直接调用MethodChannel似乎是不可能的。

    但是,通过创建插件,我可以实现我想要的。所以解决方案是创建一个插件:)!

    【讨论】: