摘要
-
解铃还须系铃人:SyncManager的优化无法同Job机制中被一同优化
-
原因:涉及Sync相关的策略,Job 如果直接管控,涉及sync的都会被不加区分地变成一刀切的情况,即无法细化,风险很大。故SyncManager优化效果最大化,精细化和源头化只能是在SyncManager本身。
-
具体阐述:
-
SyncManager 调研 JobScheduler SDK进行同步, 主要区别是:设置AppStandy的FLAG_EXEMPT_FROM_APP_STANDBY豁免;达到sync的豁免
-
SyncManager 主要提供给被授权账户进行同步数据用途,例如联系人、邮箱、日历,这里有个大前提,必须先在Setting中设置账户中添加;
-
相关源码:
- SyncManager->SyncManager:maybeRescheduleSync
- SyncManager->SyncManager:MESSAGE_SCHEDULE_SYNC
- SyncManager->SyncManager:deferSyncH
- SyncManager->SyncManager:deferStoppedSyncH
- SyncManager->SyncManager:maybeUpdateSyncPeriodH
- SyncManager->SyncManager:updateOrAddPeriodicSyncH
- SyncManager->SyncManager:runBoundToAdapterH
- SyncManager->SyncManager:reschedulePeriodicSyncH
- SyncManager->SyncManager:runSyncFinishedOrCanceledH
- SyncManager->SyncManager:scheduleSyncOperationH()
- SyncManager->SyncManager:JobInfo.Builder
- SyncManager->>JobScheduler:scheduleAsPackage
- JobScheduler->>JobSchedulerImpl:scheduleAsPackage
- JobSchedulerImpl->>JobSchedulerService:scheduleAsPackage
scheduleSyncOperationH(SyncOperation syncOperation, long minDelay) {
if(不能忽略bakoff参数) {
minDelay = 延迟
}
if(非周期Job) {
更新delay时间戳:syncOperation.expectedRuntime = now + minDelay;
去重sync
更新豁免Flag:syncOperation.syncExemptionFlag = inheritedSyncExemptionFlag;
}
获取优先级:int priority = syncOperation.findPriority();
设置Job的网络类型:networkType = syncOperation.isNotAllowedOnMetered() ?JobInfo.NETW