Flutter + AlarmManager = ⏰

語言: CN / TW / HK

Flutter + AlarmManager = ⏰

原文 https://medium.com/flutter-community/flutter-alarmmanager-f184671240cb

前言

如果您是一名 Android 開發人員,當您希望將應用程式安排在將來的特定時間執行時,可以使用 AlarmManager。如果你是一個 iOS 開發者,這種型別的元件並不存在。

如果你是一個 Flutter 開發者,你會怎麼做?

像大多數與 Flutter 相關的事情一樣,當您想要使用特定於平臺的元件時,您需要公開它的功能。

AlarmManager 也不例外。

本文將介紹 Android AlarmManager Plus 包,並展示如何在應用程式中使用它。

準備好設鬧鐘了嗎?

正文

Setup 設定

  • 開啟 pubspec.yaml 檔案並新增以下內容:

yaml dependencies: android_alarm_manager_plus: ^2.0.6

Something 免責宣告 → 撰寫本文時,最新版本是 2.0.6

  • 執行 pub get下載依賴項

我們將使用您在 Android Studio 中建立 Flutter 專案時獲得的普通專案(減去所有計數器邏輯)。

  • 開啟 AndroidManifest.xml 檔案並新增以下許可權:

```xml

```

  • 在您的應用程式標籤中,新增以下內容:

xml <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>

最後,你的 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) -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

```

AndroidManifest.xml

Alarm Bells Are Ringing

該包公開了一個 AndroidAlarmManager 物件,該物件具有以下(相關)方法:

  • oneShot : 一次性觸發警報
  • oneShotAt : 在特定日期觸發一次性警報
  • periodic : 在規定的時間間隔內觸發警報

讓我們詳細討論每個選項。

OneShot 方法接受以下引數:

dart static Future<bool> oneShot( Duration delay, int id, Function callback, { bool alarmClock = false, bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, })

oneShot method

前三個引數(延遲、 id 和 callback)是不言自明的,因此我們將關注其餘的。

  • AlarmClock - 一個標誌,指示計時器是否將與 Android 的 AlarmManagerCompact.setAlarmClock 一起設定
  • AllowWhileIdle - 一個標誌,指示計時器是否將用 AlarmManagerCompat.setExactAndAllowWhildle 或 AlarmManagerCompat.setAndAllowWhileIdle 設定
  • Sec - 指示是否使用 AlarmManagerCompat.setExact 設定計時器的標誌
  • wakeup - 一個標誌,表明如果裝置將被喚醒時,警報將被觸發
  • rescheduleOnReboot - 一個標誌,表明如果警報將持續之間的裝置重新啟動

OneShotAt 方法與 oneShot 方法非常相似,只有一個關鍵字不同。第一個引數是一個 DateTime 物件,該物件設定警報觸發的時間,而不是持續時間型別的延遲。

dart static Future<bool> oneShotAt( DateTime time, int id, Function callback, { bool alarmClock = false, bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, })

periodic 方法接受下引數:

dart static Future<bool> periodic( Duration duration, int id, Function callback, { DateTime? startAt, bool allowWhileIdle = false, bool exact = false, bool wakeup = false, bool rescheduleOnReboot = false, })

正如您所看到的,這個方法在它接受的引數中也是類似的。這裡最重要的論點是:

  • StartAt : 指示第一次觸發警報的時間
  • duration : 負責每隔一段時間重新觸發警報。

記得設定鬧鐘

關於 Alarm Manager Plus 包需要注意的一點是,它使用隔離程式來執行警報。隔離類似於執行緒,只是它們不共享記憶體。因此,它們與資訊交流。

因此,您必須將警報處理程式(callback)宣告為靜態的,以便可以訪問它們。

你可以在這裡瞭解更多關於 isolates 的資訊。

程式碼

https://github.com/ducafecat/MediumArticles

結束語

如果本文對你有幫助,請轉發讓更多的朋友閱讀。

也許這個操作只要你 3 秒鐘,對我來說是一個激勵,感謝。

祝你有一個美好的一天~


© 貓哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://video.ducafecat.tech