App 設置鬧鐘後,Android 5.1 原生系統通知欄額外顯示一個紅色鬧鐘圖標,點擊觸發異常彈窗,干擾用戶體驗。
調用 AlarmManager.setAlarmClock(AlarmClockInfo, PendingIntent) 會觸發系統內置鬧鐘 UI。該方法最終調用 setImpl(RTC_WAKEUP, ..., WINDOW_EXACT, ..., info),系統會在鎖屏/通知欄顯示鬧鐘圖標,點擊時廣播 AlarmManager.ACTION_ALARM_CHANGED 或直接啟動 PendingIntent,導致 App 的 BroadcastReceiver.onReceive() 被雙重觸發。
// 不顯示系統鬧鐘圖標
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
// 或
alarmManager.setExactAndAllowWhileIdle(...)
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null && intent.getAction().equals("android.intent.action.ALARM_CHANGED")) {
return; // 忽略系統鬧鐘圖標點擊觸發的廣播
}
// 正常業務邏輯
}
alarmManager.cancel(pendingIntent);
// 系統會自動移除對應的鎖屏/通知欄鬧鐘圖標
setAlarmClock,5.0 以下無此問題。setExactAndAllowWhileIdle 是精確鬧鐘的推薦替代。核心原則:不需要系統鬧鐘 UI 時,堅決不用 setAlarmClock。