[英]AlarmManager does not wakeup at right time on Samsung Phone
不幸的是,在某些三星手機上,我們不得不發現AlarmManager(SamsungAlarmManager)無法正常工作。
我們的代碼是:
private void scheduleNextSamplingIntent(final Context context, final int intervalInMillis) {
Log.v(TAG, "scheduleNextSamplingIntent | intervalInMillis = " + intervalInMillis);
if (intervalInMillis <= 0) {
Log.w(TAG, "scheduleNextSamplingIntent | invalid interval " + intervalInMillis);
return;
}
long currentTimeMillis = DeviceClock.getInstance().getCurrentTimeMillis();
long triggerAtMillis = currentTimeMillis + intervalInMillis;
Log.v(TAG, "scheduleNextSamplingIntent | currentTimeMillis = " + currentTimeMillis);
Log.v(TAG, "scheduleNextSamplingIntent | triggerAtMillis = " + triggerAtMillis);
PendingIntent samplingPendingIntent = getSamplePendingIntent(context);
AlarmManagerCompat alarmManager = new AlarmManagerCompat(context);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtMillis, samplingPendingIntent);
}
我們懷疑,該應用程序將在一段時間(例如1分鍾)后被喚醒,但有時計時器醒來時間太晚了!
logcat的輸出為:
10-25 15:26:03.118 32734 32734 I MotionDetectorService: Analyzed motion: SLEEPING
10-25 15:26:03.120 32734 32734 D MotionDetector: symptomaticStateGracePeriodOver ? 1540473963119 - 1540473823091 = 140028 ?> 300000
10-25 15:26:03.120 32734 32734 D MotionDetector: Still symptomatic but grace period not over yet. Keep gracing ...
10-25 15:26:03.121 32734 32734 V MotionDetectorService: notifyListeners | MotionDetector
10-25 15:26:03.121 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | intervalInMillis = 13000
10-25 15:26:03.122 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | currentTimeMillis = 1540473963121
10-25 15:26:03.122 32734 32734 V MotionDetectorService: scheduleNextSamplingIntent | triggerAtMillis = 1540473976121
10-25 15:26:03.137 3781 4353 D SamsungAlarmManager: setExact Intent (T:0/F:5/AC:false) 20181025T153059 - CU:10227/CP:32734
計時器應在1540473976(Unix)上觸發=> 2018-10-25T15:26:16
但是,為什么將SamsungAlarmManager設置為15:30:59?
這是怎么了 有什么建議么?
(看來問題僅出現在裝有Android 8.0的Samsung S8和Samsung S7設備上)
經過數小時的測試,我們發現了一種解決方法,可以在不到5分鍾的三星android手機上啟動計時器。
我似乎在空閑模式下經過一段時間后,SamsungAlarmManager不允許將計時器設置為少於5分鍾。 如果手機處於空閑模式(打light模式),則由於電池優化,SamsungAlarmManager會將setExact-Time從13s覆蓋到5分鍾。 將應用程序放入電池優化白名單(不受監視的電池應用程序)無濟於事! (似乎三星簡單地忽略了此列表!!!)
我們的解決方法現在是使用AlarmManager.setAlarmClock()而不是setExactAndAllowWhileIdle()。 但是這種解決方案的缺點是在右上角顯示了一個鬧鍾圖標。 為了避免這種情況,我們在電話處於交互狀態時使用setExactAndAllowWhileIdle(),而只有在電話不是交互式時才使用setAlarmClock()!
因此,我們將計時器設置為少於5分鍾的代碼現在是:
public void setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive(final int type, final long triggetAtMillis, final PendingIntent operation) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !mPowerManager.isInteractive()) {
Log.v(TAG, "setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive | not interacive | setAlarmClock = " + triggetAtMillis);
mAlarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggetAtMillis, operation), operation);
} else {
Log.v(TAG, "setExactAndAllowWhileIdleOrAlarmClockWhenNotInteractive | interacive | setExactAndAllowWhileIdle = " + triggetAtMillis);
setExactAndAllowWhileIdle(type, triggetAtMillis, operation);
}
}
注意:華為手機與三星手機具有相同的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.