Android中FCM推送触发闹钟重启延迟及设备重启状态判断
解决设备重启后FCM推送触发闹钟延迟的问题
嘿,这个问题我之前做项目时也碰到过!不少厂商的定制系统会延迟甚至抑制ACTION_BOOT_COMPLETED广播,导致依赖这个广播重置闹钟的逻辑失效,进而出现闹钟响铃延迟的情况。下面给你两个可靠的方法,让你在接收FCM推送时就能判断设备是否处于刚重启的状态:
方法1:通过系统启动时间判断
设备重启后,SystemClock.elapsedRealtime()会重置为0,我们可以通过计算当前时间与系统启动时间的差值,来判断设备是否刚重启不久。具体实现代码如下:
- 计算系统启动的时间戳:
long bootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
- 设置合理阈值(比如5分钟,可按需调整),对比当前时间与启动时间的间隔:
long currentTime = System.currentTimeMillis(); // 判断是否处于重启后5分钟内 boolean justRebooted = (currentTime - bootTime) < 5 * 60 * 1000;
如果justRebooted返回true,说明设备刚重启,此时你可以直接重新设置闹钟,不用等BOOT_COMPLETED广播触发。
方法2:用SharedPreferences标记重启状态
我们可以在BOOT_COMPLETED广播接收器中标记系统已完成启动,在接收FCM推送时检查这个标记——如果标记不存在或为false,就判定设备刚重启:
- 在
BOOT_COMPLETED广播接收器中写入标记:
@Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { SharedPreferences prefs = context.getSharedPreferences("AppBootPrefs", Context.MODE_PRIVATE); prefs.edit().putBoolean("isBootCompleted", true).apply(); // 这里也可以顺便重置所有需要的闹钟 resetAllAlarms(context); } }
- 在FCM推送接收逻辑中检查标记:
SharedPreferences prefs = getApplicationContext().getSharedPreferences("AppBootPrefs", Context.MODE_PRIVATE); boolean isBootCompleted = prefs.getBoolean("isBootCompleted", false); if (!isBootCompleted) { // 设备刚重启,还没收到BOOT_COMPLETED广播,直接重置目标闹钟 resetYourTargetAlarm(); // 更新标记,避免重复处理 prefs.edit().putBoolean("isBootCompleted", true).apply(); }
另外,别忘了在应用首次安装启动时初始化这个标记,避免误判:
// 在自定义Application的onCreate方法中 SharedPreferences prefs = getSharedPreferences("AppBootPrefs", Context.MODE_PRIVATE); if (!prefs.contains("isBootCompleted")) { prefs.edit().putBoolean("isBootCompleted", true).apply(); }
额外提示
- 你的闹钟设置代码已经适配了不同Android版本的API(
setExactAndAllowWhileIdle等),这部分逻辑没问题,继续保留即可。 - 部分厂商会限制应用自启动权限,记得引导用户开启,否则
BOOT_COMPLETED广播可能完全无法接收。
内容的提问来源于stack exchange,提问作者Asha Soman
相关产品推荐
相关产品推荐

