但是我使用AlarmManager在后台代码中运行代码。我需要在此代码中启动UI(例如调用通知或拨打智能手机)。我想知道怎么做吗?我知道如何运行后台任务,但不知道如何启动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(),
});
}
}
答案 0 :(得分:2)
在official docs之后(中篇文章here),Flutter中的背景隔离具有无头的FlutterNativeView,因此您将永远无法从背景隔离中绘制任何内容。地理围栏示例显示了两个选项:
让您的主要Isolate在IsolateNameServer上注册一个SendPort。请参见示例here。这在实践中可能毫无价值,因为在后台经过任何有意义的时间后(或如果用户明确将其关闭),当Activity被杀死时,SendPort将被销毁。
让背景隔离显示通知。请参见示例here。当通知与之交互时,FlutterLocalNotifications将启动您的主/ UI隔离。如果通知被撤消,或者您需要在准确的闹钟时间发送通知以外的其他内容,那么您可能暂时不走运。
请注意,隔离点之间基本上没有可靠的零通信,因此,如果您依赖于任何共享数据,则必须发挥创造力。
最后一点,您可能需要升级到Flutter的最新版本(> = 1.12),以解决一些插件注册问题。将以下内容添加到您的Android清单中,位于主活动下方:
<activity>
...
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />