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

