auto_start_flutter
Ein Flutter-Plugin zur Verwaltung von Hintergrundausführungsrechten. Unterstützt Android-Auto-Start-Einstellungen (Xiaomi usw.) und iOS-Hintergrund-App-Aktualisierung.
Ein Paket zur Verwaltung von Autostart-Berechtigungen, um Hintergrundprobleme auf einigen Telefonen zu beheben.
{"sdk":"flutter"}^2.1.8^6.0.0{"sdk":"flutter"}Englischer Projektschnappschuss. Aktuelle Inhalte auf GitHub.
A Flutter plugin to help manage background execution permissions on Android, iOS, macOS, Windows, and Linux devices. It supports requesting "Auto-Start" permissions on specific Android OEM devices, checking "Background App Refresh" status on iOS, and managing "Startup Apps / Login Items" settings on Windows and macOS to ensure your app can run reliably in the background.
Add the package to your pubspec.yaml:
auto_start_flutter: ^1.5.0
Import the package:
import 'package:auto_start_flutter/auto_start_flutter.dart';
| Feature | Android | iOS | Windows | macOS | Linux |
|---|---|---|---|---|---|
isAutoStartAvailable |
Checks manufacturer whitelist | Checks UIBackgroundRefreshStatus |
Returns true |
Returns true |
Returns true |
getAutoStartPermission |
Opens Auto Start / App Info | Opens App Settings | Opens Startup Apps | Opens Login Items | Returns true (No-op) |
openAppInfo |
Opens App Info | Opens App Settings | Opens Apps & Features | Opens General Settings | Returns true (No-op) |
getDeviceManufacturer |
Returns Build.MANUFACTURER |
Returns "Apple" | Returns "Microsoft" | Returns "Apple" | Returns "Linux" |
isBatteryOptimizationDisabled |
Checks doze mode status | Returns true (Always valid) |
Returns true |
Returns true |
Returns true |
disableBatteryOptimization |
Direct dialog prompt (REQUEST_IGNORE...) |
Opens App Settings | Opens Power & Sleep | Opens Energy Saver | Returns true (No-op) |
openBatteryOptimizationSettings |
Opens battery optimization list (Google Play safe) | Opens App Settings | Opens Power & Sleep | Opens Energy Saver | Returns true (No-op) |
canScheduleExactAlarms |
Checks AlarmManager.canScheduleExactAlarms() (Android 12+) |
Returns true |
Returns true |
Returns true |
Returns true |
openExactAlarmSettings |
Opens "Alarms & reminders" settings (Android 12+) | Returns false (No-op) |
Returns false (No-op) |
Returns false (No-op) |
Returns false (No-op) |
openCustomSetting |
Opens specific activity | Not Supported | Not Supported | Not Supported | Not Supported |
registerBootCallback |
Uses BOOT_COMPLETED trigger |
Not Supported | Writes to Startup Registry | Registers via SMAppService |
Writes -autostart to ~/.config/autostart/ |
startForegroundService |
Starts Foreground Service | Not Supported | Returns false (No-op) |
Returns false (No-op) |
Returns false (No-op) |
executeInBackground |
Headless Engine | Headless Engine | Hidden Process | Headless Engine | Hidden Process |
On Android, this checks if the device is from a manufacturer known to have aggressive auto-start restrictions and redirects the user to the appropriate settings page. On iOS, this checks if Background App Refresh is enabled. If not, it redirects the user to the App Settings page where they can enable it. On Windows and macOS, this opens the Startup Apps or Login Items system settings, where users can toggle your app's startup status.
import 'package:auto_start_flutter/auto_start_flutter.dart';
// ...
// 1. Check if auto-start permission is available / relevant
// Android: Returns true for Xiaomi, Oppo, Vivo, etc.
// iOS: Returns true if Background App Refresh is available (not restricted).
var isAvailable = await isAutoStartAvailable;
if (isAvailable == true) {
// 2. Request permission / Open Settings
// Android: Opens Auto Start settings or App Info.
// iOS: Opens App Settings.
// Windows/macOS: Opens Startup Apps / Login Items settings.
await getAutoStartPermission();
}
App Info: Open the system settings page for the app.
// Android: Opens App Info
// iOS: Opens App Settings
await openAppInfo();
Device Manufacturer: Get the device manufacturer.
String? manufacturer = await getDeviceManufacturer();
// e.g. "Xiaomi", "Apple", "Samsung"
Custom Settings (Android Only): If you know the specific package and activity name for a setting page on a specific device, you can attempt to open it directly.
// Example: Try opening a specific hidden setting
await openCustomSetting(
packageName: 'com.android.settings',
activityName: 'com.android.settings.Settings\$PowerUsageSummaryActivity',
);
The plugin provides advanced lifecycle hooks to natively launch your app in the background across platforms.
Boot Completed Trigger (registerBootCallback): Run a headless Dart callback or launch your app the moment the device turns on.
BOOT_COMPLETED intent and spawns a secure background FlutterEngine.--autostart flag directly into the HKCU\Software\Microsoft\Windows\CurrentVersion\Run registry.SMAppService.mainApp.register() API to register the application into Login Items seamlessly (macOS 13+)..desktop file natively inside ~/.config/autostart/.import 'dart:ui';
import 'package:flutter/material.dart';
// 1. Must be a top-level or static function
@pragma('vm:entry-point')
void myBootCallback() {
WidgetsFlutterBinding.ensureInitialized();
print("Device booted! Running in the background...");
}
// 2. Register it somewhere in your app (e.g. main.dart)
await registerBootCallback(myBootCallback);
Note: On Android, you must manually add the RECEIVE_BOOT_COMPLETED permission to your AndroidManifest.xml (see Mandatory Setup below).
Foreground Service Keep-Alive (Android): Start a foreground service to prevent Android from killing your app when it goes to the background. This will pin a persistent notification to the user's status bar.
// Start the service
await startForegroundService(
title: "Syncing Data",
content: "Do not close the app.",
);
// Stop the service when done
await stopForegroundService();
Note: On Android, you must manually add the FOREGROUND_SERVICE permission to your AndroidManifest.xml (see Mandatory Setup below).
Exact Scheduling & Alarms (scheduleTask): Schedule a task to run precisely at a future timestamp.
AlarmManager for highly accurate background wakes, triggering a headless Dart callback even in Doze mode.UNUserNotificationCenter. It will schedule a Local Notification for the exact timestamp. When the user taps the notification, the app opens, and getLaunchArguments will contain the taskId and callbackHandle. This will prompt the user for Notification Permissions the first time it is called.systemd user timers.final at = DateTime.now().add(Duration(minutes: 5));
bool success = await scheduleTask(at, myScheduledTaskCallback, taskId: "my_task_1");
// On app startup, check if we were launched by a scheduled task
final args = await getLaunchArguments();
if (args['scheduledTaskId'] == 'my_task_1') {
print("Woke up from scheduled task!");
}
Exact Alarm Permissions (Android 12+ / API 31+): Starting in Android 12, apps scheduling exact alarms must verify permission:
// Check if exact alarms can be scheduled
bool canSchedule = await canScheduleExactAlarms();
if (!canSchedule) {
// Guide user to the system "Alarms & reminders" settings page
await openExactAlarmSettings();
}
Headless Execution (executeInBackground) (Phase 3): Execute a Dart callback immediately in the background without bringing the app to the foreground or attaching a UI.
FlutterEngine / Isolate.// 1. Must be a top-level or static function
@pragma('vm:entry-point')
void myHeadlessTask() {
WidgetsFlutterBinding.ensureInitialized();
print("Running in the background instantly!");
}
// 2. Trigger execution
await executeInBackground(myHeadlessTask);
Android's Doze mode and App Standby can restrict background processing. On Windows and macOS, energy/power settings can similarly affect background performance.
Check Status: Check if your app is already ignoring battery optimizations.
bool isExempt = await isBatteryOptimizationDisabled ?? false;
print("Battery Optimization Disabled: $isExempt");
Open Battery Optimization Settings (Recommended & Google Play Safe):
Navigates the user to the standard system battery optimization list (ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS on Android). This does not require declaring high-risk permissions or justifying policies in Google Play Console.
if (!isExempt) {
await openBatteryOptimizationSettings();
}
Direct Dialog Exemption (Requires Policy Declaration):
On Android 6.0+, prompts the user directly via a system dialog using ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS.
[!WARNING] Google Play strictly limits apps requesting direct battery exemption dialogs. Only use
disableBatteryOptimization()if your app qualifies under Google Play exemption policies. Otherwise, useopenBatteryOptimizationSettings().
if (!isExempt) {
await disableBatteryOptimization();
}
| Platform | Supported | Notes |
|---|---|---|
| Android | ✅ | Supports custom OEM intents and standard battery optimization settings. |
| iOS | ✅ | Checks UIBackgroundRefreshStatus and opens App Settings. |
| Windows | ✅ | Opens Startup Apps settings. |
| macOS | ✅ | Opens Login Items settings. |
| Linux | ✅ | Basic support. Most methods return logical defaults as DE APIs vary wildly. |
Note: Standard Android APIs do not allow checking if "Auto Start" is actually enabled.
isAutoStartAvailableonly returnstrueif the device manufacturer is on the supported list (e.g. Xiaomi, Oppo). On Windows and macOS,isAutoStartAvailablereturnstrueto indicate that the "Startup Apps" / "Login Items" setting is accessible. Only iOS allows verifying the actual background refresh status programmatically.
To keep the plugin lightweight and privacy-focused, permissions are no longer included by default. You must add the permissions required for the features you intend to use to your android/app/src/main/AndroidManifest.xml.
Required for registerBootCallback.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Required for startForegroundService.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- For Android 14+ -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
Required for scheduleTask.
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<!-- For Android 13+ -->
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
Required for disableBatteryOptimization (direct dialog prompt):
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Note: If you use openBatteryOptimizationSettings(), no special permission is required in your AndroidManifest.xml!
No special permissions are strictly required for executeInBackground to spin up the background isolate. However, if your headless task requires internet access or long-running CPU locks, ensure standard Flutter network permissions or battery optimization exemptions are handled.
If you find any issues or would like to add support for more devices, please file an issue or pull request on GitHub.