dart - 如何使用flutter和alarmManager从后台代码启动一个ui?
问题描述
我使用 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(),
});
}
}
解决方案
按照官方文档(此处为中篇文章),Flutter 中的背景隔离体有一个无头的 FlutterNativeView,因此您永远无法从背景隔离体中绘制任何内容。地理围栏示例显示了两个选项:
让您的主 Isolate 向 IsolateNameServer 注册一个 SendPort。请参见此处的示例。这在实践中可能毫无价值,因为在后台任何有意义的时间后(或者如果用户明确关闭它),当 Activity 被杀死时,SendPort 将被销毁。
让背景隔离显示通知。请参见此处的示例。FlutterLocalNotifications 将在与通知交互时启动您的主/UI 隔离。如果通知被忽略,或者您需要在准确的闹钟时间发出通知以外的其他内容,那么您现在可能不走运。
请注意,隔离之间的可靠通信基本上为零,因此如果您依赖任何共享数据,则必须具有创造力。
最后一点,您可能需要升级到最新版本的 Flutter (>=1.12) 以解决一些插件注册问题。将以下内容添加到您的 Android 清单中,就在主 Activity 下方:
<activity>
...
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
推荐阅读
- install.packages - 为什么我尝试在 RStudio 中安装包“tidytext”时出现依赖错误
- html - 如何在下拉列表的值项列表中禁用选择或灰显特定值(
或者 ) 在 7 号角 - c - 如何在 rust 中使用已编译的 C .so 文件
- python - 如何更改 cv2.boundingRect 的值
- windows - 为什么 git bash 在 PyCharm 上表现得很奇怪?
- c++-winrt - 我们如何在 C++/WinRt 项目中添加事件?
- python - 增加数字并在输入框中显示该数字
- python - 使用 scipy 将 CDF 与真实数据拟合,但 CDF 不是从 0 开始
- c# - 如何在 ASP.NET Core 3.1 中找到 bin 目录?
- outlook - 我可以使用收件人日历中的数据填充 Outlook 可操作邮件吗?