You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Android Alarm Manager Plus真机周期性通知失效求助

问题

使用flutter android alarm manager包实现本地周期性通知,在模拟器中运行完全正常,但生成APK安装到安卓真机后,无法显示任何通知,求解决经验。

核心代码

Future<void> notify() async {
  try {
    await Quote.saveNewQuote();
  } catch (e) {
    print(e.toString());
  }

  AwesomeNotifications().createNotification(
      content: NotificationContent(
        id: 1,
        channelKey: 'basic_notification',
        title: 'Notification',
        body: 'Android alarm manager periodical notification',
      ));
  
 // await Quote.notifyLastQuote();
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  await AwesomeNotifications().initialize('resource://drawable/fitjerk_logo',
      [
        NotificationChannel(
            channelKey: 'basic_notification',
            channelName: 'FitJerk Motivation',
            channelDescription: "FitJerk Today Notification ",
            defaultColor: primaryDeepColor,
            importance: NotificationImportance.High,
            ledColor: Colors.white,
            playSound: true,
            enableLights: true,
            enableVibration: true
        )
      ]);

  await AndroidAlarmManager.periodic(const Duration(hours: 24), 1, notify,
      startAt: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 30),
      exact: true, wakeup: true, allowWhileIdle: true, rescheduleOnReboot: true);
}

AndroidManifest.xml配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.fit_jerk">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <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"/>
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
   <application
        android:label="FitJerk"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
       tools:ignore="ExtraText">
<!--       this portion is for android alarm plus-->
<!--        android:name = "io.flutter.app.FlutterApplication"-->
       <service
           android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmService"
           android:permission="android.permission.BIND_JOB_SERVICE"
           android:exported="false"
           tools:ignore="MissingClass" />
       <receiver
           android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmBroadcastReceiver"
           android:exported="false"
           tools:ignore="MissingClass" />
       <receiver
           android:name="dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver"
           android:enabled="false"
           android:exported="false"
           tools:ignore="MissingClass">
           <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
       </receiver>

        <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">
            <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>
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />

       <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
       <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>

       <activity android:name="com.facebook.FacebookActivity"
           android:configChanges=
               "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
           android:label="@string/app_name"
           tools:ignore="MissingClass" />
       <activity
           android:name="com.facebook.CustomTabActivity"
           android:exported="true"
           tools:ignore="MissingClass">
           <intent-filter>
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.BROWSABLE" />
               <data android:scheme="@string/fb_login_protocol_scheme" />
           </intent-filter>
       </activity>

       <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-8656344449994415~3632328521"/>
    </application>
</manifest>

排查解决经验

  • 权限补全:
    • Android 12+需动态请求SCHEDULE_EXACT_ALARM权限,仅在Manifest声明无效,要在代码里判断权限状态,未授权则引导用户到设置页开启。
    • Android 13+必须动态申请POST_NOTIFICATIONS权限,否则系统会直接拦截通知,哪怕Manifest里已经声明。
  • 闹钟逻辑调整:
    • 测试时把startAt设为当前时间加几分钟,避免因已过设定时间导致第一次触发延迟到次日,方便快速验证。
    • 部分国产ROM会忽略allowWhileIdle参数,需额外处理后台保活,比如引导用户开启“后台运行权限”。
  • 通知通道与图标检查:
    • 确认NotificationChannel的importance为High或更高,低重要性通知会被归类到静默通知,容易被忽略。
    • 暂时替换通知图标为系统默认图标,排除因自定义图标资源路径错误、格式不兼容导致的通知不显示问题。
  • 厂商ROM适配:
    • 小米、华为、OPPO等品牌有独立的后台管理机制,必须引导用户将APP加入“后台白名单”、关闭“智能省电”或“应用休眠”,否则闹钟和通知会被系统强制终止。
  • 代码调试:
    • 在notify函数中加入本地日志(比如写入文件),确认函数是否被触发:若未触发则是闹钟调度问题,若触发但无通知则是AwesomeNotifications配置问题。
    • 简化notify中的逻辑,先注释掉Quote.saveNewQuote()这类耗时操作,排除因异步任务阻塞导致通知代码未执行的情况。

内容的提问来源于stack exchange,提问作者Kafiul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:30:49