Flutter 本地通知 - 当应用程序在后台运行时,ZonedSchedule 通知不起作用

Posted

技术标签:

【中文标题】Flutter 本地通知 - 当应用程序在后台运行时,ZonedSchedule 通知不起作用【英文标题】:Flutter Local notifications - ZonedSchedule notification is not working while the app in background 【发布时间】:2021-08-29 07:00:49 【问题描述】:

我正在为警报应用程序使用 Flutter 本地通知插件,当应用程序打开或关闭时警报会触发,但是当它在后台时它无法工作,直到它恢复,即使它不是在正确的时间,我知道这很奇怪事情,但它正在发生

初始化:

 Future<void> initNotifications() async 
    final initSettingsandroid =
        const AndroidInitializationSettings("@mipmap/ic_launcher");
    final initSettings = InitializationSettings(
      android: initSettingsAndroid,
    );
    await FlutterLocalNotificationsPlugin().initialize(initSettings);
    tz.initializeTimeZones();
    final String currentTimeZone =
        await FlutterNativeTimezone.getLocalTimezone();
    tz.setLocalLocation(tz.getLocation(currentTimeZone));
  

报警功能:

void alarm(String title, String body, DateTime fireTime) async 
    const androidPlatformChannalSpecifics = AndroidNotificationDetails(
      "alarm notification",
      "alarm notification",
      "Channal for Alarm Notification",
      icon: "@mipmap/ic_launcher",
      sound: RawResourceAndroidNotificationSound("alarm"),
      importance: Importance.max,
      priority: Priority.max,
      fullScreenIntent: true,
    );

    const notificationDetails =
        NotificationDetails(android: androidPlatformChannalSpecifics);

    await FlutterLocalNotificationsPlugin().zonedSchedule(
      0,
      title,
      body,
      TZDateTime.from(fireTime, tz.local),
      notificationDetails,
      payload: "isPressed",
      androidAllowWhileIdle: true,
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime,
    );
  

我的权限和接收者:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
   <uses-permission android:name="android.permission.VIBRATE" />
   <uses-permission android:name="android.permission.WAKE_LOCK" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
   <application
        android:label="Prodkit"
        android:icon="@mipmap/ic_launcher">
        <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
        <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
       </intent-filter>
        </receiver>
        <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
        <activity
            android:name=".MainActivity"
            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"
            android:showWhenLocked="true"
            android:turnScreenOn="true">

我不知道到底是什么问题,但我尝试了很多方法,但都没有成功。

【问题讨论】:

【参考方案1】:

我看到你正在设置fullScreenIntent: true,,所以根据官方文档:

如果您的应用程序需要调度全屏意图的能力 通知,将以下属性添加到您的活动中 开幕。对于 Flutter 应用程序,通常只有一个 活动从 FlutterActivity 扩展而来。这些属性确保 屏幕会在设备锁定时打开并显示。

<activity
    android:showWhenLocked="true"
    android:turnScreenOn="true">

确保您已将此添加到您的AndroidManifest.xml

【讨论】:

我已经添加了这个,它也不起作用。 文档中还提到了一件事:“对于Android 8.0+,声音和振动与通知通道相关联,只能在首次创建时进行配置。显示/调度通知将创建一个具有指定 id 的频道,如果它不存在。如果另一个通知指定了相同的频道 id,但尝试指定另一个声音或振动模式,那么什么都不会发生。也许只是尝试更改频道 ID 以验证是否不是这种情况。

以上是关于Flutter 本地通知 - 当应用程序在后台运行时,ZonedSchedule 通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:当应用程序在后台时使用路径提供程序

应用程序进入后台时在 Flutter 上显示本地通知

Flutter:在应用程序关闭或在后台运行原生 android 代码

当应用程序未运行时,通过静默推送通知在后台更新本地数据库

当应用程序进入暂停状态时取消本地通知。(从后台删除)

后台 FCM 触发时生成 Flutter 本地通知