Flutter + AlarmManager = ⏰

Flutter + AlarmManager = ⏰

原文 medium.com/flutter-com…

前言

Flutter + AlarmManager = ⏰

假如您是一名 Android 开发人员,当您期望将应用程序安排在将来的特定时刻运转时,能够运用 AlarmManager。假如你是一个 iOS 开发者,这种类型的组件并不存在。

假如你是一个 Flutter 开发者,你会怎么做?

像大多数与 Flutter 相关的工作相同,当您想要运用特定于渠道的组件时,您需求公开它的功能。

AlarmManager 也不破例。

本文将介绍 Android AlarmManager Plus 包,并展示如安在应用程序中运用它。

准备好设闹钟了吗?

正文

Setup 设置

  • 翻开 pubspec.yaml 文件并添加以下内容:
dependencies:
  android_alarm_manager_plus: ^2.0.6

Something 免责声明 → 撰写本文时,最新版本是 2.0.6

  • 运转 pub get下载依赖项

咱们将运用您在 Android Studio 中创建 Flutter 项目时取得的一般项目(减去一切计数器逻辑)。

  • 翻开 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"/>
  • 在您的应用程序标签中,添加以下内容:
<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 文件应该是这样的:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tomerpacific.alarm_manager_example">
    <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"/>
   <application
        android:label="alarm_manager_example"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
       <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>
    </application>
</manifest>

AndroidManifest.xml

Alarm Bells Are Ringing

该包公开了一个 AndroidAlarmManager 目标,该目标具有以下(相关)办法:

  • oneShot : 一次性触发警报
  • oneShotAt : 在特定日期触发一次性警报
  • periodic : 在规则的时刻距离内触发警报

让咱们详细评论每个选项。

OneShot 办法承受以下参数:

 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 目标,该目标设置警报触发的时刻,而不是继续时刻类型的延迟。

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 办法承受下参数:

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 的信息。

代码

github.com/ducafecat/M…

结束语

假如本文对你有帮助,请转发让更多的朋友阅览。

或许这个操作只需你 3 秒钟,对我来说是一个鼓励,感谢。

祝你有一个夸姣的一天~


猫哥

  • 微信 ducafecat

  • wiki.ducafecat.tech

  • video.ducafecat.tech