【Flutter】android_alarm_manager_plusでイベントを取得する

Flutter

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エンベディングに応じてプラグインを初期化する方法を背景サービスに伝える必要があります。

アラームクロックのインテント受信

アラームクロックアプリの場合、oneShotoneShotAtalarmClock引数を設定すると、システム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
}

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました