公司項目開發時,同事見解總結。BUG基本都是在三星機器上出現。
1.PendingIntent.getBroadcast的第4個參數flags,建議用PendingIntent.FLAG_UPDATE_CURRENT,因爲FLAG_CANCEL_CURRENT只是給Intent打上cancel標記,並沒有立即取消,而FLAG_UPDATE_CURRENT只是更新那個Intent的狀態,不會產生新的Intent。(可通過 adb shell dumpsys alarm 查看應用alarm相關信息)
2.PendingIntent.getBroadcast的第2個參數requestCode可以用來區分不同的鬧鐘。requestCode應當是一個常量,不然會產生多個鬧鐘。
3.不要使用AlarmManager.setRepeating方法。setRepeating註冊的鬧鐘會常駐在Android系統進程裏,那怕應用進程被殺掉,鬧鐘也不會被取消。如果需要重複性的鬧鐘,可以在接到鬧鐘廣播後,再重新啓動一個鬧鐘,自己模擬setRepeating。
示例代碼:
Intent intent = new Intent("com.example.action.alarm");
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent,PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, sTime, pendingIntent);
修改後覆蓋安裝,可能還有這個問題。因爲覆蓋安裝,舊版本註冊的鬧鐘還在,只有重啓手機纔會清空。