Flutter后台服务管理插件flutter_background_service_platform_interface的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter后台服务管理插件flutter_background_service_platform_interface的使用

flutter_background_service_platform_interface简介

flutter_background_service_platform_interface 是一个为 flutter_background_service 插件提供的通用平台接口。这个接口允许特定平台实现 flutter_background_service 插件,确保它们支持相同的接口。

使用方法

为了实现一个新的特定平台的 flutter_background_service 实现,你需要扩展 FlutterBackgroundServicePlatform 类,提供执行特定平台行为的实现,并在注册你的插件时,通过调用 FlutterBackgroundServicePlatform.instance = MyPlatformPathProvider() 设置默认的 FlutterBackgroundServicePlatform

注意事项

强烈建议优先选择非破坏性的变更(例如在接口中添加方法)而不是破坏性的变更。有关为什么一个不太整洁的接口优于破坏性变更的讨论,请参见 https://flutter.dev/go/platform-interface-breaking-changes

示例代码

下面是一个完整的示例demo,演示了如何使用 flutter_background_service_platform_interface 来创建和管理后台服务:

import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_background_service_android/flutter_background_service_android.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  initializeService();
  runApp(MyApp());
}

Future<void> initializeService() async {
  final service = FlutterBackgroundService();
  await service.configure(
    androidConfiguration: AndroidConfiguration(
      // this will be executed when app is in foreground or background in separated isolate
      onStart: onStart,
      // auto start service
      autoStart: true,
      isForegroundMode: true,
    ),
    iosConfiguration: IosConfiguration(
      // auto start service
      autoStart: true,
      // this will be called on iOS background fetch
      onFetch: onIosBackgroundFetch,
    ),
  );
}

// to ensure onStart is only called one time when we press the notification start command button.
bool isRunning = false;

void onStart(ServiceInstance service) async {
  if (service is AndroidServiceInstance) {
    service.on('setAsForeground').listen((event) {
      service.setAsForegroundService();
    });

    service.on('setAsBackground').listen((event) {
      service.setAsBackgroundService();
    });
  }

  service.on('stopService').listen((event) {
    service.stopSelf();
  });

  // bring to foreground
  Timer.periodic(Duration(seconds: 1), (timer) async {
    if (!isRunning) {
      isRunning = true;
      // your logic to handle task
      // for example, send location to server every 15 minutes

      // test using external plugin
      final deviceInfo = DeviceInfoPlugin();
      String deviceData = '';
      if (await service.isForegroundService()) {
        if (Platform.isAndroid) {
          final androidInfo = await deviceInfo.androidInfo;
          deviceData = androidInfo.model;
        } else if (Platform.isIOS) {
          final iosInfo = await deviceInfo.iosInfo;
          deviceData = iosInfo.model;
        }
      }

      service.invoke(
        'updateNotification',
        {
          "current_date": DateTime.now().toIso8601String(),
          "device_data": deviceData,
        },
      );

      isRunning = false;
    }
  });
}

void onIosBackgroundFetch(String taskId) async {
  // your logic to handle background fetch for iOS
  // after executing the task, you need to call ServiceController#completeBackgroundTask
  FlutterBackgroundService().completeBackgroundTask(taskId);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Background Service")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              var service = FlutterBackgroundService();
              var status = await service.isRunning();
              if (status) {
                service.invoke("stopService");
              } else {
                service.startService();
              }
            },
            child: Text("Start/Stop Service"),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们首先初始化了后台服务,配置了Android和iOS的设置。然后定义了 onStartonIosBackgroundFetch 方法来处理服务启动和iOS背景获取的任务。最后,在UI部分,我们提供了一个按钮来启动或停止后台服务。


更多关于Flutter后台服务管理插件flutter_background_service_platform_interface的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台服务管理插件flutter_background_service_platform_interface的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,flutter_background_service_platform_interface 是一个用于在不同平台上实现后台服务管理的接口插件。这个插件本身并不直接提供后台服务的实现,而是作为一个桥梁,允许开发者在不同的平台(如Android和iOS)上实现后台服务的具体逻辑。

以下是一个简要的代码示例,展示了如何使用 flutter_background_service_platform_interface 以及如何在Android和iOS平台上实现后台服务。请注意,这个例子主要是为了说明如何使用接口,实际的服务逻辑需要在对应的平台上实现。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_background_service_platform_interface: ^x.y.z  # 替换为最新版本号

2. 创建平台接口实现

Android 平台

android/app/src/main/kotlin/.../YourApplication.kt 中实现后台服务:

package com.example.yourapp

import android.app.Service
import android.content.Intent
import android.os.IBinder
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import your.package.name.BackgroundServiceInterface

class MyBackgroundService : Service(), BackgroundServiceInterface {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // 在这里实现你的后台服务逻辑
        return START_STICKY
    }

    override fun onBind(intent: Intent?): IBinder? {
        // 如果你需要绑定服务,这里实现绑定逻辑
        return null
    }

    companion object {
        // 用于启动服务的静态方法
        fun startService(context: Context, flutterEngine: FlutterEngine) {
            val intent = Intent(context, MyBackgroundService::class.java)
            // 可以在这里传递数据给服务
            context.startService(intent)
        }
    }
}

然后,在 GeneratedPluginRegistrant.kt 中注册服务(如果需要的话,这通常不是必需的,除非你有特定的初始化逻辑):

import io.flutter.plugins.GeneratedPluginRegistrant
import your.package.name.MyBackgroundService

class MyPluginRegistrant: GeneratedPluginRegistrant() {
    override fun registerWith(registrar: Registrar) {
        super.registerWith(registrar)
        // 在这里注册你的服务或其他组件
    }
}

iOS 平台

在iOS上,你需要创建一个新的后台任务。在 ios/Runner/AppDelegate.swift 中:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    // 示例:开始后台任务
    func startBackgroundTask() {
        let backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
            UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
        })

        // 在这里执行你的后台任务逻辑

        // 任务完成后结束后台任务
        UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
    }
}

3. 在Flutter中使用接口

在你的Flutter代码中,你可以通过定义一个抽象类来使用 flutter_background_service_platform_interface

import 'package:flutter/services.dart';
import 'package:flutter_background_service_platform_interface/flutter_background_service_platform_interface.dart';

abstract class BackgroundService implements BackgroundServicePlatformInterface {
  static const MethodChannel _channel = MethodChannel('your.package.name/background_service');

  static BackgroundService instance = _$BackgroundServiceImpl(); // 假设你有一个生成的实现类

  @override
  Future<void> startService() async {
    try {
      await _channel.invokeMethod('startService');
    } on PlatformException catch (e) {
      throw e;
    }
  }

  // 其他方法的实现...
}

4. 调用后台服务

在你的Flutter应用中调用后台服务:

void _startBackgroundService() async {
  try {
    await BackgroundService.instance.startService();
  } catch (e) {
    print('Failed to start background service: $e');
  }
}

注意

  • 上述代码仅为示例,具体实现需要根据你的需求进行调整。
  • flutter_background_service_platform_interface 本身不提供后台服务的实现,你需要根据平台特性实现具体的服务逻辑。
  • 在实际开发中,可能需要处理更多细节,如权限请求、服务生命周期管理等。

希望这个示例能帮助你理解如何使用 flutter_background_service_platform_interface 在Flutter中实现后台服务管理。

回到顶部