【问题标题】:How to call Dart from Android in background如何在后台从 Android 调用 Dart
【发布时间】:2020-12-26 04:31:21
【问题描述】:

当活动在后台或根本没有活动时,我试图从 Android 调用 Dart 代码。例如,当警报管理器触发时。

这是我的飞镖代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp());

  const MethodChannel _kChannel =
      MethodChannel('mychannel');
  _kChannel.setMethodCallHandler((call) {
    if (call.method == 'method1') {
      return ...;
    }
    if (call.method == 'method2') {
      return ...;
    }
    return Future.value();
  });
}

来自 Java:

Application.channel.invokeMethod(method, arguments, new MethodChannel.Result() {...});

channel 是从我的 mainactivity 初始化的静态变量。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    Application.channel = new MethodChannel(getFlutterView(), CHANNEL_ID);
}

这在 Activity 处于前台时有效。但是当它在后台时,我会收到以下通知:FlutterView.send called on a detached view, channel=mychannel

调用没有被执行。如何在后台从 Android 调用 Dart?

编辑

我的用例是一个纯粹的 Android 用例。这基本上是流程:

  1. 警报管理器触发并接收到广播事件。 Dit 是在没有库的情况下完成的。这主要发生在应用未处于活动状态时。
  2. 在广播接收器中,从 Firebase 读取一些数据并设置通知。
  3. 根据 Firebase 中的数据安排新警报。

在颤振/飞镖中,我已经获得了从 Firebase 获取数据的业务逻辑。显然我不想再写这些了,但现在用 Java。

我不想使用警报管理器插件和本地通知插件,因为它们在不同的隔离区中运行会导致麻烦。

【问题讨论】:

标签: android flutter dart flutter-method-channel


【解决方案1】:

这个问题的答案有点棘手。 首先,你想从后台执行什么?您是否在特定时间或按定义的时间间隔运行后台服务或安排任何作业?

如果你想安排一个后台作业或周期性任务,你想经常执行,你可以看看https://pub.dev/packages/workmanager插件,它可以让你安排后台作业,让你在活动时从后台执行飞镖代码没有活着。

如果你想用原生代码构建自己的后台服务:Android/iOS,并想从中调用 dart 代码,你应该阅读以下文章:

The Tricky Task of Keeping Flutter Running

The Tricky Task of Keeping Flutter Running (Vol. 2)

我必须说,从 本机后台服务 运行 dart 代码并不是一件简单的事情,你肯定需要挠头才能实现你想要的。

另外,请注意 Android 和 iOS 中的后台执行限制。一旦你对此感到满意,这是另一个要深入研究的话题。

【讨论】:

    【解决方案2】:

    ViewModel 的范围比 Activity Lifecycle 更大。您可以从 ViewModel 类方法而不是 Activity 中调用您的颤振代码。 https://developer.android.com/topic/libraries/architecture/viewmodel

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2019-05-12
    • 2017-01-19
    • 2013-08-03
    相关资源
    最近更新 更多