【问题标题】:How to invoke method channel from Workmanager task如何从 Workmanager 任务调用方法通道
【发布时间】:2023-01-24 15:36:54
【问题描述】:

我在 Android 构建的 MainActivity 类中注册了一个方法通道,从前台应用程序调用时它工作正常。

我想从 Workmanager 在后台运行的任务中调用此方法通道,但我每次都收到 MissingPluginException。

我猜这是行不通的,因为后台任务没有初始化 MainActivity,但我似乎找不到任何关于如何在 workmanager 可以调用它们的地方注册通道的信息。

我的(简化的)设置如下: 库/main.dart:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask('uniquename', 'taskName',
    frequency: const Duration(minutes: 15),
    constraints: Constraints(networkType: NetworkType.connected));

  runApp(const MyApp());
}

void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) async {
    bool result = await DeviceInfoModel().getDeviceInfo();
    return Future.value(result);
  });
}

lib/device_info.dart:

class DeviceInfoModel extends ChangeNotifier {
  static const platform = MethodChannel('deviceInfo');

  Future<void> getDeviceInfo() async {
    final int result = await platform.invokeMethod('getBatteryLevel');
    // And other similar calls to other methods
  }
}

android/app/src/main/kotlin/nl/myapp/MainActivity.kt:

package nl.myapp

class MainActivity : FlutterActivity() {
  private val DEVICE_INFO_CHANNEL = "deviceInfo"

  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)

    methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, DEVICE_INFO_CHANNEL)

    methodChannel?.setMethodCallHandler { call, result ->
      if (call.method == "getBatteryLevel") {
        result.success(100)
      }
    }
  }
}

【问题讨论】:

    标签: android flutter flutter-method-channel flutter-workmanager


    【解决方案1】:

    @Julian 你有什么解决办法吗?我还需要在后台和终止状态调用方法通道,但还没有成功。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多