如何使用颤振和警报管理器从后台代码启动 UI?



我使用AlarmManager在后台代码中运行代码,但是。我需要在此代码中启动一个 UI(例如呼叫通知或拨打智能手机(。我想知道如何做到这一点?我知道如何运行后台 tak,但不知道如何启动 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,因此您将永远无法从后台隔离中提取任何内容。地理围栏示例显示了两个选项:

  1. 让您的主隔离向隔离名称服务器注册 SendPort。请参阅此处的示例。这在实践中可能毫无价值,因为当活动在后台任何有意义的时间后被终止时(或者如果用户显式关闭它(,SendPort 将被销毁。

  2. 让后台隔离显示通知。请参阅此处的示例。FlutterLocalNotifications 将在与通知交互时启动您的主/UI 隔离。如果通知被关闭,或者您需要在精确的闹钟时间通知以外的其他内容,那么您现在可能不走运。

请注意,隔离器之间的可靠通信基本上为零,因此如果您依赖任何共享数据,则必须具有创造力。

最后,您可能需要升级到最新版本的 Flutter (>=1.12( 来解决一些插件注册问题。将以下内容添加到主活动下方的 Android 清单中:

<activity>
...
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />

最新更新