如何在 Flutter 建立一個後臺任務

會煮咖啡的貓發表於2022-01-21

原文

https://www.dltlabs.com/blog/...

參考

正文

今天,我將解釋如何在 Flutter 建立一個後臺任務。

在此之前,讓我們理解什麼是後臺任務。後臺任務是在後臺執行的應用程式的輔助程式,即使應用程式沒有執行或處於終止狀態。

這一功能對於需要在後臺執行任務而不需要使用者開啟應用程式的應用程式來說是有益的ーー例如,每 15 分鐘呼叫 api 獲取資料。

讓我們在一個示例專案中實現一個後臺任務,以便更好地理解這一操作的含義。

步驟:

  • pubspec.yaml
flutter pub add background_fetch
flutter pub get
  • 在 main.dart 檔案中匯入後臺包,並註冊 HeadlessTask,以便在應用程式終止後接收 backgroundFetch 事件。

例如:

void backgroundFetchHeadlessTask(HeadlessTask task) async {var taskId = task.taskId;
if(taskId == ‘your_task_id’) {
print(‘your_task_id’);
print(‘[BackgroundFetch] Headless event received.’);
_//TODO: perform tasks like — call api, DB and local notification etc…
_}
}
void main() {
runApp(MyApp());
_//Registering backgroundFetch to receive events after app is terminated.
// Requires {stopOnTerminate: false, enableHeadless: true}
_BackgroundFetch._registerHeadlessTask_(backgroundFetchHeadlessTask);
}

這裡我們必須傳遞一個頂級函式。讓我們在 registerHeadlessTask 方法中給它命名為 call back dispatcher。然後我們定義需要在後臺執行的任務:

配置 BackgroundFetch

Future<void> initPlatformState() async {
_// Configure BackgroundFetch.
_var status = await BackgroundFetch._configure_(BackgroundFetchConfig(
minimumFetchInterval: 15,
forceAlarmManager: false,
stopOnTerminate: false,
startOnBoot: true,
enableHeadless: true,
requiresBatteryNotLow: false,
requiresCharging: false,
requiresStorageNotLow: false,
requiresDeviceIdle: false,
requiredNetworkType: NetworkType.NONE,
), _onBackgroundFetch, _onBackgroundFetchTimeout);
print(‘[BackgroundFetch] configure success: $status’);
_// Schedule backgroundfetch for the 1st time it will execute with 1000ms delay.
// where device must be powered (and delay will be throttled by the OS).
_BackgroundFetch.scheduleTask(TaskConfig(
taskId: “com.dltlabs.task”,
delay: 1000,
periodic: false,
stopOnTerminate: false,
enableHeadless: true
));
}

呼叫 initState 中的 initPlatformState 方法並設定 BackgroundFetchConfig 類的配置。換句話說,在傳遞其他引數的同時,提供註冊一次性任務或週期性任務的選項。

在這裡,如果存在多個任務,任務 id 可以幫助我們輕鬆地識別單個任務。輸入資料可以是處理任務所需的任何資訊。

如果我們希望在應用程式處於終止狀態時繼續工作,請將 stopOnTerminate 引數的值設定為 false 。如果 stopOnTerminate 設定為 true ,後臺服務將在應用程式終止時終止。

void _onBackgroundFetchTimeout(String taskId) {
print(“[BackgroundFetch] TIMEOUT: $taskId”);
BackgroundFetch.finish(taskId);
}

當作業系統沒有執行後臺任務或者任務無法在給定時間內執行時,將呼叫 onBackgroundFetchTimeout 方法。在這種方法中,我們可以用任務 Id 來處理任務。

void _onBackgroundFetch(String taskId) async {
if(taskId == ‘your_task_id’) {
print(‘[BackgroundFetch] Event received’);
//TODO: perform your task like : call the API’s, call the DB and local notification.
}
}

當後臺服務執行事件時,將呼叫 onBackgroundFetch 方法。在這個方法中,我們將接收任務 id 作為一個引數,它可以用來處理任務。在需要呼叫 api 將資料儲存到資料庫或顯示本地通知等情況下,這一點非常重要。

預設情況下,呼叫任務之後的時間間隔的頻率為 15 分鐘。如果你想把它設定成其他的東西,你也可以在這裡做。在 Android 上,後臺程式的最小時間間隔為 15 分鐘。如果該值小於 15,Android 預設使用 15 分鐘。

Also, we must also remember to make changes inside the info.plist and manifest.xml file for both iOS \& Android. We need to set some of the permissions, and we also need to copy and paste other settings. If you need these settings, you can get them at the following links: Android , OS.

此外,我們還必須記住對 Android IOS 的 info.plistmanifest.xml 檔案進行更改。我們需要設定一些許可權,還需要複製和貼上其他設定。如果你需要這些設定,你可以通過以下連結獲得: IOS , Android

謝謝你的閱讀!


© 貓哥

訂閱號

相關文章