You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现后台振动:点击按钮后延时锁屏/后台振动需求咨询

Flutter后台延迟振动实现方案指导

一、flutter_background_service的适用性

flutter_background_service是目前Flutter生态中实现后台任务的主流方案之一,完全适配你的需求——它可以在应用退至后台、设备锁屏时保持任务运行,并且支持在后台服务中调用振动API,是当前最优的选择之一。

二、具体实现步骤

1. 依赖配置

在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  vibration: ^1.7.6
  flutter_background_service: ^4.2.0

执行flutter pub get安装依赖。

2. 后台服务初始化与任务处理

  • 首先在应用启动时初始化后台服务:
import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:vibration/vibration.dart';

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

Future<void> initializeService() async {
  final service = FlutterBackgroundService();
  await service.configure(
    androidConfiguration: AndroidConfiguration(
      // Android要求后台服务必须转为前台服务才能长时间运行,需配置通知
      onStart: onStart,
      autoStart: false,
      isForegroundMode: true,
      notificationChannelId: 'vibration_task_channel',
      initialNotificationTitle: '后台振动任务运行中',
      initialNotificationContent: '等待指定时间后振动',
    ),
    iosConfiguration: IosConfiguration(
      autoStart: false,
      onForeground: onStart,
      onBackground: onIosBackground,
    ),
  );
}

// Android后台服务逻辑
void onStart(ServiceInstance service) async {
  service.on('start_vibration').listen((data) {
    int delaySeconds = data['delay'] ?? 10;
    Future.delayed(Duration(seconds: delaySeconds), () async {
      if (await Vibration.hasVibrator() ?? false) {
        Vibration.vibrate(duration: 500); // 振动500毫秒
      }
      // 任务完成后可转为后台服务,隐藏通知
      if (service is AndroidServiceInstance) {
        service.setAsBackgroundService();
      }
    });
  });
}

// iOS后台回调,返回true允许后台执行任务
bool onIosBackground(ServiceInstance service) {
  WidgetsFlutterBinding.ensureInitialized();
  service.on('start_vibration').listen((data) {
    int delaySeconds = data['delay'] ?? 10;
    Future.delayed(Duration(seconds: delaySeconds), () async {
      if (await Vibration.hasVibrator() ?? false) {
        Vibration.vibrate(duration: 500);
      }
    });
  });
  return true;
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final service = FlutterBackgroundService();
              await service.startService();
              // 发送延迟振动指令,替换X为实际需要的秒数
              service.invoke('start_vibration', {'delay': X});
            },
            child: const Text('设置X秒后振动'),
          ),
        ),
      ),
    );
  }
}

3. 平台特定权限配置

Android端

在android/app/src/main/AndroidManifest.xml中添加权限与服务声明:

<!-- 添加必要权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<!-- 在<application>标签内添加服务声明 -->
<service
  android:name="id.flutter.flutter_background_service.BackgroundService"
  android:permission="android.permission.BIND_JOB_SERVICE"
  android:exported="false"/>
<service
  android:name="id.flutter.flutter_background_service.BackgroundServiceTask"
  android:permission="android.permission.BIND_JOB_SERVICE"
  android:exported="false"/>
iOS端

在ios/Runner/Info.plist中添加后台模式配置:

<key>UIBackgroundModes</key>
<array>
  <string>processing</string>
  <string>fetch</string>
</array>

同时在ios/Runner/AppDelegate.swift中配置后台任务标识:

import UIKit
import Flutter
import flutter_background_service_ios

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    SwiftFlutterBackgroundServicePlugin.taskIdentifier = "com.your.app.vibration.task"
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

三、关键注意事项

  • Android:后台服务必须转为前台模式(显示通知),否则系统会快速终止服务;若需超过10分钟的延迟,建议配合AlarmManager实现精准定时。
  • iOS:后台任务单次执行时长有限制(通常不超过30秒),如果X秒超出这个范围,需依赖flutter_background_service封装的BGTaskScheduler实现定时任务,避免被系统终止。
  • 振动权限:确保平台权限配置完整,vibration包通常会自动处理基础权限,但需确认是否有额外权限需求。

内容的提问来源于stack exchange,提问作者Josip Domazet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:31