首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 5.1+ 系統鬧鐘圖標干擾應用鬧鐘的解決方案

     編輯:程式設計疑難解答

問題現象

App 設置鬧鐘後,Android 5.1 原生系統通知欄額外顯示一個紅色鬧鐘圖標,點擊觸發異常彈窗,干擾用戶體驗。

根因分析

調用 AlarmManager.setAlarmClock(AlarmClockInfo, PendingIntent) 會觸發系統內置鬧鐘 UI。該方法最終調用 setImpl(RTC_WAKEUP, ..., WINDOW_EXACT, ..., info),系統會在鎖屏/通知欄顯示鬧鐘圖標,點擊時廣播 AlarmManager.ACTION_ALARM_CHANGED 或直接啟動 PendingIntent,導致 App 的 BroadcastReceiver.onReceive() 被雙重觸發。

解決方案

  1. 改用非鬧鐘類型 API:
    // 不顯示系統鬧鐘圖標
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
    // 或
    alarmManager.setExactAndAllowWhileIdle(...)
  2. 若必須用 setAlarmClock,在 Receiver 中過濾:
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null && intent.getAction().equals("android.intent.action.ALARM_CHANGED")) {
            return; // 忽略系統鬧鐘圖標點擊觸發的廣播
        }
        // 正常業務邏輯
    }
  3. 取消鬧鐘時同步清理系統圖標:
    alarmManager.cancel(pendingIntent);
    // 系統會自動移除對應的鎖屏/通知欄鬧鐘圖標

版本適配建議

  • Android 5.1 (API 22) 引入 setAlarmClock,5.0 以下無此問題。
  • Doze 模式 (API 23+) 下 setExactAndAllowWhileIdle 是精確鬧鐘的推薦替代。
  • Target API 26+ 需適配通知渠道,否則鬧鐘通知可能不顯示。

核心原則:不需要系統鬧鐘 UI 時,堅決不用 setAlarmClock。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved