我使用 AlarmManager 在后台代码中运行代码,但是。我需要在此代码中启动一个用户界面(例如调用通知或调用智能手机)。我想知道该怎么做?我知道如何运行后台任务,但不知道如何启动 UI。
import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:relax/pages/intro.dart';
import 'package:relax/pages/splash_screen.dart';
import 'package:android_alarm_manager/android_alarm_manager.dart';
void printHello() {
final DateTime now = new DateTime.now();
final int isolateId = Isolate.current.hashCode;
print("[$now] Hello, world! isolate=${isolateId} function='$printHello'");
}
void main() async {
await AndroidAlarmManager.initialize();
final int helloAlarmID = 0;
runApp(new MyApp());
await AndroidAlarmManager.periodic(const Duration(seconds: 15), helloAlarmID, printHello);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(title: 'Flutter Demo', initialRoute: '/', routes:
{
'/': (context) => SplashScreen(),
'/intro': (context) => IntroPage(),
});
}
}
最佳答案
遵循 official docs (中篇文章 here ),Flutter 中的背景 Isolate 有一个 headless FlutterNativeView,因此您永远无法从背景 Isolate 中绘制任何内容。地理围栏示例显示了两个选项:
让您的主隔离向 IsolateNameServer 注册 SendPort。参见示例here 。这在实践中可能毫无值(value),因为当 Activity 在后台运行一段有意义的时间后(或者用户明确关闭它)被终止时,SendPort 将被销毁。
让后台隔离显示通知。参见示例here 。当与通知交互时,FlutterLocalNotifications 将启动您的主/UI 隔离。如果通知被忽略,或者您除了在精确的闹钟时间收到通知之外还需要其他内容,那么您现在可能不太走运。
请注意,隔离区之间的通信基本上是零可靠的,因此如果您依赖任何共享数据,则必须发挥创意。
最后一点,您可能需要升级到最新版本的 Flutter (>=1.12) 以解决一些插件注册问题。将以下内容添加到 Android list 中主 Activity 的正下方:
<activity>
...
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
关于dart - 如何使用flutter和alarmManager从后台代码启动ui?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52190326/