A Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire.
After importing this plugin to your project as usual, add the following to your AndroidManifest.xml
within the <manifest></manifest>
tags:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
Next, within the <application></application>
tags, add:
<service android:name="io.flutter.plugins.androidalarmmanager.AlarmService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false"/> <receiver android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver" android:exported="false"/> <receiver android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver" android:enabled="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver>
Then in Dart code add:
import 'package:android_alarm_manager/android_alarm_manager.dart'; void printHello() { final DateTime now = DateTime.now(); final int isolateId = Isolate.current.hashCode; print("[$now] Hello, world! isolate=${isolateId} function='$printHello'"); } main() async { final int helloAlarmID = 0; await AndroidAlarmManager.initialize(); runApp(...); await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello); }
printHello
will then run (roughly) every minute, even if the main app ends. However, printHello
will not run in the same isolate as the main application. Unlike threads, isolates do not share memory and communication between isolates must be done via message passing (see more documentation on isolates here).
If alarm callbacks will need access to other Flutter plugins, including the alarm manager plugin itself, it is necessary to teach the background service how to initialize plugins. This is done by giving the AlarmService
a callback to call in the application‘s onCreate
method. See the example’s Application overrides. In particular, its Application
class is as follows:
public class Application extends FlutterApplication implements PluginRegistrantCallback { @Override public void onCreate() { super.onCreate(); AlarmService.setPluginRegistrant(this); } @Override public void registerWith(PluginRegistry registry) { GeneratedPluginRegistrant.registerWith(registry); } }
Which must be reflected in the application's AndroidManifest.xml
. E.g.:
<application
android:name=".Application"
...
Note: Not calling AlarmService.setPluginRegistrant
will result in an exception being thrown when an alarm eventually fires.
For help getting started with Flutter, view our online documentation.
For help on editing plugin code, view the documentation.