You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.3 KiB
194 lines
5.3 KiB
import 'dart:async';
|
|
import 'dart:io';
|
|
import 'dart:ui';
|
|
|
|
import 'package:device_info_plus/device_info_plus.dart';
|
|
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';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
Future<void> main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
await initializeService();
|
|
runApp(const 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 executed when app is in foreground in separated isolate
|
|
onForeground: onStart,
|
|
|
|
// you have to enable background fetch capability on xcode project
|
|
onBackground: onIosBackground,
|
|
),
|
|
);
|
|
service.startService();
|
|
}
|
|
|
|
// to ensure this is executed
|
|
// run app from xcode, then from xcode menu, select Simulate Background Fetch
|
|
bool onIosBackground(ServiceInstance service) {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
print('FLUTTER BACKGROUND FETCH');
|
|
|
|
return true;
|
|
}
|
|
|
|
void onStart(ServiceInstance service) async {
|
|
|
|
// Only available for flutter 3.0.0 and later
|
|
DartPluginRegistrant.ensureInitialized();
|
|
|
|
// For flutter prior to version 3.0.0
|
|
// We have to register the plugin manually
|
|
|
|
|
|
SharedPreferences preferences = await SharedPreferences.getInstance();
|
|
await preferences.setString("hello", "world");
|
|
|
|
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(const Duration(seconds: 1), (timer) async {
|
|
final hello = preferences.getString("hello");
|
|
print(hello);
|
|
|
|
if (service is AndroidServiceInstance) {
|
|
service.setForegroundNotificationInfo(
|
|
title: "My App Service",
|
|
content: "Updated at ${DateTime.now()}",
|
|
);
|
|
}
|
|
|
|
/// you can see this log in logcat
|
|
print('FLUTTER BACKGROUND SERVICE: ${DateTime.now()}');
|
|
|
|
// test using external plugin
|
|
final deviceInfo = DeviceInfoPlugin();
|
|
String? device;
|
|
if (Platform.isAndroid) {
|
|
final androidInfo = await deviceInfo.androidInfo;
|
|
device = androidInfo.model;
|
|
}
|
|
|
|
if (Platform.isIOS) {
|
|
final iosInfo = await deviceInfo.iosInfo;
|
|
device = iosInfo.model;
|
|
}
|
|
|
|
service.invoke(
|
|
'update',
|
|
{
|
|
"current_date": DateTime.now().toIso8601String(),
|
|
"device": device,
|
|
},
|
|
);
|
|
});
|
|
}
|
|
|
|
class MyApp extends StatefulWidget {
|
|
const MyApp({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<MyApp> createState() => _MyAppState();
|
|
}
|
|
|
|
class _MyAppState extends State<MyApp> {
|
|
String text = "Stop Service";
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
home: Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Service App'),
|
|
),
|
|
body: Column(
|
|
children: [
|
|
StreamBuilder<Map<String, dynamic>?>(
|
|
stream: FlutterBackgroundService().on('update'),
|
|
builder: (context, snapshot) {
|
|
if (!snapshot.hasData) {
|
|
return const Center(
|
|
child: CircularProgressIndicator(),
|
|
);
|
|
}
|
|
|
|
final data = snapshot.data!;
|
|
String? device = data["device"];
|
|
DateTime? date = DateTime.tryParse(data["current_date"]);
|
|
return Column(
|
|
children: [
|
|
Text(device ?? 'Unknown'),
|
|
Text(date.toString()),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
ElevatedButton(
|
|
child: const Text("Foreground Mode"),
|
|
onPressed: () {
|
|
FlutterBackgroundService().invoke("setAsForeground");
|
|
},
|
|
),
|
|
ElevatedButton(
|
|
child: const Text("Background Mode"),
|
|
onPressed: () {
|
|
FlutterBackgroundService().invoke("setAsBackground");
|
|
},
|
|
),
|
|
ElevatedButton(
|
|
child: Text(text),
|
|
onPressed: () async {
|
|
final service = FlutterBackgroundService();
|
|
var isRunning = await service.isRunning();
|
|
if (isRunning) {
|
|
service.invoke("stopService");
|
|
} else {
|
|
service.startService();
|
|
}
|
|
|
|
if (!isRunning) {
|
|
text = 'Stop Service';
|
|
} else {
|
|
text = 'Start Service';
|
|
}
|
|
setState(() {});
|
|
},
|
|
),
|
|
],
|
|
),
|
|
floatingActionButton: FloatingActionButton(
|
|
onPressed: () {},
|
|
child: const Icon(Icons.play_arrow),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|