当前位置:   article > 正文

在Flutter中使用后台任务调度(APP在后台保活)_flutter websocket 保活

flutter websocket 保活

前言
移动应用开发中,有时我们希望应用能够在后台执行一些任务,例如定期更新数据、推送通知,或者保持与服务器的持久连接。在Flutter中,通过后台调度任务(Background Fetch)可以实现这一目标,确保应用在后台仍然能够保持活跃状态。本文将介绍如何在Flutter应用中配置后台任务调度,以便持续运行你的应用。
背景
在移动应用中,当应用进入后台(用户切换到其他应用或锁屏)时,通常会进入休眠状态以节省系统资源。然而,有些应用可能需要在后台执行一些关键任务,例如定期更新数据或保持与服务器的通信。这就是后台任务调度发挥作用的地方。
使用Background Fetch实现

一、导入依赖

1.在Flutter/pubspec.yaml中添加以下内容:

 background_fetch: ^1.1.6
 //运行flutter pub
  • 1
  • 2

2.在Android/build.gradle中添加以下内容:

 maven {
    // [required] background_fetch
    url "${project(':background_fetch').projectDir}/libs"
 }
  • 1
  • 2
  • 3
  • 4

3.在Android/AndroidManifest 中添加以下内容:

如果您希望通过 forceAlarmManager: true 对事件进行精确调度,则 Android 14 (SDK 34)
已限制使用。如需继续在 Android 14 中使用精确的事件计时功能,您可以手动将此权限添加到 AndroidManifest 中。

<uses-permission android:minSdkVersion="34" android:name="android.permission.USE_EXACT_ALARM" />
  • 1

1.后台任务调度权限
2.网络访问权限(如果应用在后台需要网络访问)
3.电池状态权限(如果应用在后台需要检查电池状态)
4.存储权限(如果应用在后台需要访问存储)

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 1
  • 2
  • 3
  • 4
  • 5

二、 配置后台任务

void startBackgroundFetch() {
  BackgroundFetch.start().then((int status) {
    Global().writeLog('[BackgroundFetch] start success: $status');
  }).catchError((e) {
    Global().writeLog('[BackgroundFetch] start FAILURE: $e');
  });
}

Future<void> initPlatformState() async {
  int status = await BackgroundFetch.configure(
    BackgroundFetchConfig(
      	minimumFetchInterval: 15,
        stopOnTerminate: false,
        enableHeadless: true,
        requiresBatteryNotLow: false,
        requiresCharging: false,
        requiresStorageNotLow: false,
        requiresDeviceIdle: false,
        requiredNetworkType: NetworkType.ANY
      	// 更多配置项...
    ),
    (String taskId) async {  // <-- Event handler
      // 处理后台任务事件
      // ...
		switch(taskId){
       	  case 'com.mqtt.mqttConnect':
       	  
          break;
      }
      // 完成任务
      BackgroundFetch.finish(taskId);
    },
    (String taskId) async {  // <-- Task timeout handler
      // 处理任务超时
      // ...

      // 完成任务
      BackgroundFetch.finish(taskId);
    },
  );
  // 配置定时任务
  BackgroundFetch.scheduleTask(TaskConfig(
    taskId: 'com.mqtt.mqttConnect',
    delay: 5000,       // 毫秒
    forceAlarmManager: true,
    periodic: true
  ));
  Global().writeLog('[BackgroundFetch] configure success: $status');

  if (!mounted) return;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  1. ‘minimumFetchInterval’:
  • 类型:‘int’
  • 意义:指定两次后台任务之间的最小时间间隔,单位是分钟。设置这个属性可以避免应用过于频繁地在后台执行任务,从而减少对系统资源的占用。
  1. ‘stopOnTerminate’:
  • 类型:‘bool’
  • 意义:确定当应用被终止时是否停止后台任务。如果设置为’true’,则在应用被终止时,后台任务也将停止。
  1. ‘enableHeadless’:
  • 类型:‘bool’
  • 意义:指定是否启用无界面的后台任务执行。如果设置为’true’,则即使应用处于后台,也可以执行后台任务。
  1. ‘requiresBatteryNotLow’:
  • 类型:‘bool’
  • 意义:确定后台任务是否要求设备电量不低。如果设置为’true’,则只有在设备电量充足时才执行后台任务。
  1. ‘requiresCharging’:
  • 类型:‘bool’
  • 意义:确定后台任务是否要求设备正在充电。如果设置为’true’,则只有在设备正在充电时才执行后台任务。
  1. ‘requiresStorageNotLow’:
  • 类型:‘bool’
  • 意义:确定后台任务是否要求设备存储空间不低。如果设置为’true’,则只有在设备存储空间充足时才执行后台任务。
  1. ‘requiresDeviceIdle’:
  • 类型:‘bool’
  • 意义:确定后台任务是否要求设备处于空闲状态。如果设置为’true’,则只有在设备空闲时才执行后台任务。
  1. ‘requiredNetworkType’:
  • 类型:‘NetworkType’
  • 意义:指定后台任务所需的网络类型。可以选择’NetworkType.ANY’(任何网络类型)、‘NetworkType.UNMETERED’(非计量网络,如Wi-Fi)等。该属性可以帮助控制在何种网络条件下执行后台任务。

三、启动后台任务

最后,我们需要在应用中的适当时机启动后台任务:

initPlatformState();
startBackgroundFetch();
  • 1
  • 2

总结
通过使用Flutter的background_fetch插件,我们可以轻松地配置和处理后台任务,确保应用在后台持续运行。这为开发者提供了更多可能性,使得一些关键任务能够在用户不直接使用应用时仍然保持活跃。当然,使用后台任务时需要注意系统资源消耗和电池寿命,以确保用户体验和设备性能的平衡。希望本文能够帮助你更好地理解如何使用后台任务调度来增强你的Flutter应用。如有任何疑问或建议,请随时留言!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/321176
推荐阅读
相关标签
  

闽ICP备14008679号