首页 > 解决方案 > Flutter 仅在设备 (Android) 连接时在后台运行(屏幕关闭)

问题描述

我开发了一个 Android 应用程序,它需要在用户的口袋里工作,所以在后台(屏幕关闭)。我惊讶地发现它可以工作,但它只有在我将 USB 插入到 androidstudio 时才有效。当我没有插入时,即使使用 workmanager 包,定时器/振动器/通知等也会停止。有解决办法吗?谢谢

这是一个简单的可复制代码,用于测试有无连接电缆的振动器和工作管理器。屏幕关闭但设备连接时振动,屏幕关闭和设备断开连接时不振动

import 'package:flutter/material.dart';
import 'package:vibration/vibration.dart';
import 'dart:async';
import 'package:workmanager/workmanager.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Background test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {


  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {



  Timer _timer;

  void callbackDispatcher() {
    Workmanager.executeTask((task, inputData) {
      return vibrator();
    });
  }

  Future<void> vibrator() async {
    setState(() {
      _timer= Timer.periodic(const Duration(seconds: 1), (timer) {
        Vibration.vibrate();
      });
    });

  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    Workmanager.initialize(
        callbackDispatcher, // The top level function, aka callbackDispatcher
        isInDebugMode: true // If enabled it will post a notification whenever the task is running. Handy for debugging tasks

    );
    Workmanager.registerOneOffTask("1", "simpleTask"); //Android only (see below)
vibrator();

  }


  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(

        title: Text("Test"),
      ),
      body: Center(


      ),
    );
  }
}

这是另一个使用 android_alarm_manager 包和传感器包的示例,用于在设备水平时激活振动。同样的问题...但是当屏幕关闭并断开连接时它会随机运行(振动)...

import 'package:sensors/sensors.dart';
import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:flutter/material.dart';
import 'package:vibration/vibration.dart';
import 'dart:async';
main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

List<double> _accelerometerValues;

List<StreamSubscription<dynamic>> _streamSubscriptions =
<StreamSubscription<dynamic>>[];
Timer _timer1;
double orientation;

test_vibration() {

  _streamSubscriptions.add(accelerometerEvents.listen((AccelerometerEvent event) {    // Stream accelerometre
      _accelerometerValues = <double>[event.y];  // lecture de l'aceleromètre y
      print('${event.y} ');

      if (event.y>6.0||event.y<-6.0){ //device vertical
        
      }else{ // device horizontal
        
        Vibration.vibrate();

      }
  }));
}
class _MyAppState extends State<MyApp> {




  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    _streamSubscriptions.add(accelerometerEvents.listen((AccelerometerEvent event) {
      setState(() {
        _accelerometerValues = <double>[event.y];
      });
      
      AndroidAlarmManager.periodic(Duration(seconds: 1), 0, test_vibration());

    }));
  }



  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center()
      ),
    );
  }
}

标签: androidflutterbackground

解决方案


推荐阅读