簡體   English   中英

AlarmManager在正確的時間無法在Samsung Phone上喚醒

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM