3

当活动处于后台或根本没有活动时,我试图从 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);
}

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

调用不会被执行。如何在后台从 Android 调用 Dart?

编辑

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

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

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

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

4

2 回答 2

0

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

如果你想安排一个后台作业或周期性任务,你想经常执行,你可以看看https://pub.dev/packages/workmanager插件,它可以让你安排后台作业并让你执行 dart 代码当您的活动不活跃时,从后台。

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

保持 Flutter 运行的棘手任务

保持 Flutter 运行的棘手任务(第 2 卷)

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

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

于 2020-09-16T12:49:51.160 回答
-1

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

于 2020-09-15T12:46:15.533 回答