Flutter智能闹钟管理插件smartalarm_alarm_manager的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter智能闹钟管理插件smartalarm_alarm_manager的使用

Deprecation Notice

此插件已被替换为Flutter社区Plus插件版本,即android_alarm_manager_plus。不再计划对该插件进行更新,我们鼓励所有用户迁移到Plus版本。

关键修复(例如安全事件)将在2021年底之前提供,之后该包将被标记为停用。

Getting Started

在将此插件导入项目后,需在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

接下来,在<application>标签内添加以下服务和广播接收器:

<service
    android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="false"/>
<receiver
    android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
    android:exported="false"/>
<receiver
    android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

然后在Dart代码中添加以下内容:

import 'package:android_alarm_manager/smartalarm_alarm_manager.dart';

void printHello() {
  final DateTime now = DateTime.now(); // 获取当前时间
  final int isolateId = Isolate.current.hashCode; // 获取当前隔离的哈希值
  print("[$now] Hello, world! isolate=${isolateId} function='$printHello'"); // 打印日志
}

void main() async {
  final int helloAlarmID = 0; // 定义闹钟ID
  await AndroidAlarmManager.initialize(); // 初始化闹钟管理器
  runApp(...); // 启动应用
  await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello); // 设置每分钟触发一次闹钟
}

printHello函数将大约每分钟运行一次,即使主应用程序结束。然而,printHello不会在与主应用程序相同的隔离中运行。与线程不同,隔离不共享内存,隔离之间的通信必须通过消息传递完成(有关隔离的更多文档可以查看Dart隔离库)。

使用其他插件在闹钟回调中

如果闹钟回调需要访问其他Flutter插件,包括闹钟管理器插件本身,则可能需要告知后台服务如何根据应用程序使用的Flutter Android嵌入方式初始化插件。

Flutter Android Embedding V1

对于Flutter Android Embedding V1,后台服务必须提供一个回调来将插件注册到后台隔离。这是通过给AlarmService提供一个调用应用程序onCreate方法的回调实现的。参见示例的Application覆盖

具体来说,其Application类如下:

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    AlarmService.setPluginRegistrant(this); // 设置插件注册器
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    GeneratedPluginRegistrant.registerWith(registry); // 注册插件
  }
}

这必须反映在应用程序的AndroidManifest.xml中。例如:

<application
    android:name=".Application"
    ...

更多关于Flutter智能闹钟管理插件smartalarm_alarm_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter智能闹钟管理插件smartalarm_alarm_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


smartalarm_alarm_manager 是一个用于在 Flutter 应用中管理智能闹钟的插件。它允许你设置、取消和管理闹钟,并在特定时间触发事件。以下是使用 smartalarm_alarm_manager 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 smartalarm_alarm_manager 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  smartalarm_alarm_manager: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:smartalarm_alarm_manager/smartalarm_alarm_manager.dart';

3. 设置闹钟

你可以使用 SmartAlarmManager 来设置闹钟。以下是一个简单的示例:

void setAlarm() async {
  DateTime alarmTime = DateTime.now().add(Duration(seconds: 10)); // 10秒后触发
  int alarmId = 1; // 闹钟的唯一ID

  await SmartAlarmManager.setAlarm(
    alarmId: alarmId,
    alarmTime: alarmTime,
    alarmTitle: "Wake Up!",
    alarmMessage: "Time to wake up!",
    // 其他可选参数
  );

  print("Alarm set for $alarmTime");
}

4. 取消闹钟

你可以通过 cancelAlarm 方法来取消已经设置的闹钟:

void cancelAlarm() async {
  int alarmId = 1; // 要取消的闹钟的ID

  await SmartAlarmManager.cancelAlarm(alarmId: alarmId);

  print("Alarm $alarmId canceled");
}

5. 监听闹钟触发事件

你可以通过 SmartAlarmManageronAlarmTriggered 流来监听闹钟触发事件:

void listenToAlarms() {
  SmartAlarmManager.onAlarmTriggered.listen((int alarmId) {
    print("Alarm $alarmId triggered!");
    // 处理闹钟触发逻辑
  });
}

6. 处理权限

在 Android 上,你可能需要请求 SCHEDULE_EXACT_ALARM 权限。你可以在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

并在运行时请求权限:

void requestPermissions() async {
  if (await SmartAlarmManager.requestPermissions()) {
    print("Permissions granted");
  } else {
    print("Permissions denied");
  }
}

7. 完整示例

以下是一个完整的示例,展示如何设置、取消和监听闹钟:

import 'package:flutter/material.dart';
import 'package:smartalarm_alarm_manager/smartalarm_alarm_manager.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AlarmScreen(),
    );
  }
}

class AlarmScreen extends StatefulWidget {
  [@override](/user/override)
  _AlarmScreenState createState() => _AlarmScreenState();
}

class _AlarmScreenState extends State<AlarmScreen> {
  int alarmId = 1;

  [@override](/user/override)
  void initState() {
    super.initState();
    listenToAlarms();
  }

  void setAlarm() async {
    DateTime alarmTime = DateTime.now().add(Duration(seconds: 10));
    await SmartAlarmManager.setAlarm(
      alarmId: alarmId,
      alarmTime: alarmTime,
      alarmTitle: "Wake Up!",
      alarmMessage: "Time to wake up!",
    );
    print("Alarm set for $alarmTime");
  }

  void cancelAlarm() async {
    await SmartAlarmManager.cancelAlarm(alarmId: alarmId);
    print("Alarm $alarmId canceled");
  }

  void listenToAlarms() {
    SmartAlarmManager.onAlarmTriggered.listen((int alarmId) {
      print("Alarm $alarmId triggered!");
      // 处理闹钟触发逻辑
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Smart Alarm Manager"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: setAlarm,
              child: Text("Set Alarm"),
            ),
            ElevatedButton(
              onPressed: cancelAlarm,
              child: Text("Cancel Alarm"),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!