android_alarm_manager_plusとは
android_alarm_manager_plusは、FlutterアプリケーションでAndroidのAlarmManagerサービスにアクセスし、アラームが発火した際にバックグラウンドでDartコードを実行するためのプラグインです。
アプリがフォアグラウンドにいない状態でも定期的にタスクを実行することができます。
android_alarm_manager_plus | Flutter package
Flutter plugin for accessing the Android AlarmManager service, and running Dart code in the background when alarms fire.
使い方
インストール
pubspec.yaml
に以下を追加して、パッケージをインストールします。
dependencies:
android_alarm_manager_plus: ^4.0.3
Android設定
AndroidManifest.xml
に以下のパーミッションを追加します。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- For apps with targetSDK 31 (Android 12) and newer -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
さらに、以下のサービスとレシーバーを<application>
タグ内に追加します。
<service
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/>
<receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Dartコード設定
以下のコードをDartファイルに追加します。
import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart';
// リリースモードでの問題を避けるために、コールバック関数にアノテーションを追加
@pragma('vm:entry-point')
static void printHello() {
final DateTime now = DateTime.now();
final int isolateId = Isolate.current.hashCode;
print("[$now] Hello, world! isolate=${isolateId} function='$printHello'");
}
void main() async {
// initialize()呼び出しがrunApp()の前にある場合に必須
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(MyApp());
final int helloAlarmID = 0;
await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello);
}
上記の設定により、printHello
関数が約1分ごとに実行されます。この関数はメインアプリケーションとは異なるアイソレートで実行されるため、メモリを共有せず、アイソレート間の通信はメッセージパッシングを通じて行われます。
他のプラグインの使用
アラームコールバックで他のFlutterプラグインにアクセスする必要がある場合、アプリケーションが使用しているFlutter Androidエンベディングに応じてプラグインを初期化する方法を背景サービスに伝える必要があります。
アラームクロックのインテント受信
アラームクロックアプリの場合、oneShot
やoneShotAt
でalarmClock
引数を設定すると、システムUIと対話する際にインテントを受信できます。これは、ユーザーがアラームを編集するために使用します。
例:
await AndroidAlarmManager.oneShotAt(
time,
id,
callback,
alarmClock: true,
params: {
'param1': 'Hello',
'param2': 'World'
}
);
インテントを受信するために、receive_intent
パッケージを使用します。
import 'package:receive_intent/receive_intent.dart';
import 'dart:convert'; // for jsonDecode
final receivedIntent = await ReceiveIntent.getInitialIntent();
if (receivedIntent.action == "android.intent.action.MAIN") {
final paramsExtra = receivedIntent.extra?["params"];
if (paramsExtra != null) {
final params = jsonDecode(paramsExtra);
// use params
// params['param1']
// params['param2']
}
final id = receivedIntent.extra?["id"];
// navigate user to alarm with given id
}