乐趣区

关于程序员:Flutter-AlarmManager-⏰

Flutter + AlarmManager = ⏰

原文 https://medium.com/flutter-co…

前言

如果您是一名 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 的信息。

代码

https://github.com/ducafecat/…

结束语

如果本文对你有帮忙,请转发让更多的敌人浏览。

兴许这个操作只有你 3 秒钟,对我来说是一个激励,感激。

祝你有一个美妙的一天~


© 猫哥

  • 微信 ducafecat
  • https://wiki.ducafecat.tech
  • https://video.ducafecat.tech

本文由 mdnice 多平台公布

退出移动版