android - 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()
),
);
}
}
解决方案
推荐阅读
- javascript - 如何更改在画布上呈现的单个对象的不透明度?
- c++ - 重载的虚拟行为是否定义良好?
- mongodb - Mongodb使用$lookup查找给定_id属于哪个对象(外域是一个数组)
- javascript - 如何使用条件语句检查 javascript 中构造函数的值?
- php - 使用数组中的数据插入多个 MYSQLI
- php - 使用 Spatie\MediaLibrary 上传文件时 Laravel 包错误
- c++ - 使用 sf::Text 数组时崩溃
- python - round() 不截断浮点数
- amazon-web-services - Amazon EMR 和 Yarn 部署模式
- angularjs - Ag-grid 分页中的奇怪文本