如何在应用程序关闭时在颤动中执行后台任务?

Posted

技术标签:

【中文标题】如何在应用程序关闭时在颤动中执行后台任务?【英文标题】:How to execute background tasks in flutter while the application is closed? 【发布时间】:2021-02-25 22:52:37 【问题描述】:

我正在尝试在 Flutter 中安排后台任务,触发通知并更新数据库行。 我正在使用:

workmanager 包在后台安排任务。 flutter_local_notifications 触发通知。 hive 持久化数据。

问题:

当应用程序处于前台或后台时,计划任务会被执行,但当应用程序关闭时,什么都不会发生。

代码示例:

该函数用于调度任务:

Future scheduleDailyUpdateTask(DomainHabit habit) async 
String uniqueName = "$DAILY_UPDATE_TASK: $habit.id";
String tag = habit.id.toString();

await Workmanager.initialize(callbackDispatcher);
await Workmanager.registerPeriodicTask(uniqueName, DAILY_UPDATE_TASK,
    tag: tag,
    inputData: 
      ID: habit.id,
    ,
    frequency: Duration(days: 1),
    initialDelay: Duration(days: 1),
    backoffPolicy: BackoffPolicy.exponential,
    backoffPolicyDelay: Duration(seconds: 10));

该函数用于执行任务:

void callbackDispatcher() 
  Workmanager.executeTask((taskName, inputData) async 
    //show the notification
    print("WorkManager task executed taskName: $taskName");
    print("inputData: $inputData");

    if (taskName == REMINDER_NOTIFICATION_TASK ||
        taskName == DAILY_UPDATE_TASK) 
      int id = inputData[ID] as int;

      await HabitDatabase.initDatabase();
      await HabitDatabase.openHabitsBox();
      Habit habit = HabitDatabase.getHabit(id);

      await NotificationHelper.initNotifications();

      if (taskName == REMINDER_NOTIFICATION_TASK) 
        await NotificationHelper.showNotification(id, habit.name,
            "Take it one day at a time, Good luck!.", habit.name);
      

      if (taskName == DAILY_UPDATE_TASK) 
        await HabitDatabase.updateHabit(
            id, habit.copyWith(days: habit.days + 1));

        await NotificationHelper.showNotification(
            id,
            habit.name,
            "Congratulations fo getting by another day, Validate your progress.",
            habit.name);
      
    

    return Future.value(true);
  );

【问题讨论】:

【参考方案1】:

在我在 android Studio 中创建的应用中,当 Activity 被“销毁”时,我会启动一项服务来重新启动应用。

此后又增加了一些参数,或许这个“重启”服务可以在Finish()中执行

更多信息在这里,也许这是正确的方向。 https://developer.android.com/reference/android/app/Activity#onDestroy()

【讨论】:

我发现这个问题在某些手机上没有出现,这个问题只出现在一些便宜的中国手机上。其中一些电话会杀死 workManager 进程。

以上是关于如何在应用程序关闭时在颤动中执行后台任务?的主要内容,如果未能解决你的问题,请参考以下文章

React Native:关闭应用程序时在 iOS 上运行后台任务的最佳方法?

linux 如何后台运行

linux后台任务执行

收到推送通知时在后台执行代码

关闭浏览器时如何在队列中执行非常繁重的任务(在后台运行)?

如何在颤动的后台运行时钟计时器?