Явные Wakelocks с JobScheduler / JobInfo - PullRequest
0 голосов
/ 27 июня 2018

Я выполняю рефакторинг этого кода:

https://github.com/r3gis3r/CSipSimple/blob/master/src/com/csipsimple/utils/TimerWrapper.java

, который использует AlarmManager для планирования таймеров. Я рефакторинг кода для использования JobScheduler в соответствии с рекомендациями Google:

/**
 * @param entryId
 * @param latencyMs
 * @brief Handler for schedule
 */
private synchronized int handleSchedule(int entryId, int latencyMs) {
    // clamp to minimum latencyMs
    latencyMs = (latencyMs < TIMER_MIN_LATENCY_MS) ? TIMER_MIN_LATENCY_MS : latencyMs;

    // Cancel previous registrations for the entryId
    mJobScheduler.cancel(entryId);
    int existingReg = mScheduleEntries.indexOf(entryId);
    if (existingReg != -1) {
        mScheduleEntries.remove(existingReg);
        mScheduleTimes.remove(existingReg);
    }

    long fireTimeMs = SystemClock.elapsedRealtime() + latencyMs;

    Log.v(TAG, "Schedule timer " + entryId + " in " + latencyMs + "ms @ " + fireTimeMs);

    ComponentName componentName = new ComponentName(mContext, PTAPITimerJobService.class);

    PersistableBundle persistableBundle = new PersistableBundle();
    persistableBundle.putInt(EXTRA_TIMER_ENTRY, entryId);
    persistableBundle.putLong(EXTRA_TIMER_EXPIRATION, fireTimeMs);

    final JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(entryId, componentName).setExtras(persistableBundle);
    jobInfoBuilder.setMinimumLatency(latencyMs);

    // TODO - set wakelock criteria
    JobInfo jobInfo = jobInfoBuilder.build();
    mJobScheduler.schedule(jobInfo);

    mScheduleEntries.add(entryId);
    mScheduleTimes.add(fireTimeMs);
    return 1;
}

Вышеуказанный метод эквивалентен doSchedule в вставленной ссылке из CSipSimple. Из документации JobInfo есть такие методы, как: setRequiredNetworkType, setRequiresDeviceIdle для установки различных условий.

Вопрос: Достаточно ли упомянуть эти критерии в JobInfo или нам нужно управлять явным WakeLock (как показано в случае AlarmManager)?

Типы WakeLock для таймера:

public class WakeLockTypes {
    public static final int     LOCK_TYPE_NONE              = 0x0;
    public static final int     LOCK_TYPE_WIFI              = 0x1;  // Keep the Wi-Fi radio awake
    public static final int     LOCK_TYPE_WIFI_MULTICAST    = 0x2;  // Allow receiving of Wifi Multicast packets
    public static final int     LOCK_TYPE_POWER_WAKE        = 0x4;  // Keeps the device CPU on
    public static final int     LOCK_TYPE_SCREEN_DIM_WAKE   = 0x8;  // Keeps the screen on (dim)

    public static final int     LOCK_TYPE_DEFAULT   = (LOCK_TYPE_SCREEN_DIM_WAKE|LOCK_TYPE_WIFI); 

}

1 Ответ

0 голосов
/ 27 июня 2018

JobScheduler будет держать ваше устройство в активном состоянии, пока ваша работа выполняется, поэтому вам не нужны ваши собственные WakeLock.

...