代码之家  ›  专栏  ›  技术社区  ›  ssk

带有jobscheduler/jobinfo的显式wakelocks

  •  1
  • ssk  · 技术社区  · 6 年前

    我正在重构此代码:

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

    它使用AlarmManager来安排计时器。我正在重构要使用的代码 JobScheduler 遵循谷歌的建议:

    /**
     * @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;
    }
    

    上述方法相当于csipsimple粘贴链接中的doschedule。从 JobInfo ,有如下方法用于设置各种条件:setRequiredNetworkType、setRequiresDeviceIdle。

    问题: 在jobinfo中提到这些条件是否足够,或者我们需要管理显式的wakelock(如AlarmManager案例所示)?

    计时器的唤醒锁类型:

    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 回复  |  直到 6 年前
        1
  •  1
  •   CommonsWare    6 年前

    JobScheduler 当你的工作正在运行时,它会让你的设备保持清醒,因此你不需要自己的设备 WakeLock 是的。