问题描述
当Activity在后台或根本没有任何活动时,我正在尝试从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用例。基本上是这样的流程:
- 警报管理器将触发并接收广播事件。 Dit是在没有库的情况下完成的。这通常是在应用程序未激活时发生的。
- 在广播接收器中,从Firebase读取一些数据并设置通知。
- 根据Firebase的数据安排新警报。
在Flutter / Dart中,我已经掌握了从Firebase提取数据的业务逻辑。显然,我不想再写一遍,但是现在用Java。
我不想使用Alarmmanager插件和本地通知插件,因为两者都运行在不同的隔离区中,因此会引起麻烦。
解决方法
这个问题的答案有些棘手。 首先,您想从后台执行什么?您是否在特定时间或按定义的时间间隔运行后台服务或调度任何作业?
如果您要安排要频繁执行的backgorund作业或定期任务,可以查看https://pub.dev/packages/workmanager插件,该插件可让您安排后台作业并在执行以下操作时从后台执行dart代码您的活动还不活跃。
如果您要使用本机代码(Android / iOS)构建自己的后台服务,并想从中调用dart代码,则应阅读以下文章:
The Tricky Task of Keeping Flutter Running
The Tricky Task of Keeping Flutter Running (Vol. 2)
我必须说,从本地后台服务运行dart代码不是一件简单的事情,您肯定需要抓紧脑袋才能实现所需的目标。
此外,请记住,Android和iOS的后台执行限制。一旦您对此有所了解,这就是另一个要挖掘的话题。
,ViewModel的范围比Activity Lifecycle大。您可以从ViewModel类方法内部而不是Activity中调用浮动代码。 https://developer.android.com/topic/libraries/architecture/viewmodel