Accounts&Sync(Auto sync should be unchecked by default)追踪 首先在设置中需要添加一个google账号: 账号:sprocommandroid@gmail.com 密码:sprocomm1 点击该账号进入账号设置界面对应的类为: ManageAccountsSettings.java (android-k\packages\apps\settings\src\com\android\settings\accounts) 该类继承自AccountPreferenceBase.java其中onResume()方法 @Override public void onResume() { super.onResume(); mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener( ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE | ContentResolver.SYNC_OBSERVER_TYPE_STATUS | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, mSyncStatusObserver); onSyncStateUpdated(); } 调用了onSyncStateUpdated();用来进行页面的显示,当然也包括默认值的设置,该方法如下 @Override protected void onSyncStateUpdated() { // Catch any delayed delivery of update messages if (getActivity() == null) return; // iterate over all the preferences, setting the state properly for each SyncInfo currentSync = ContentResolver.getCurrentSync(); boolean anySyncFailed = false; // true if sync on any account failed Date date = new Date(); // only track userfacing sync adapters when deciding if account is synced or not final SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypes(); HashSet<String> userFacing = new HashSet<String>(); for (int k = 0, n = syncAdapters.length; k < n; k++) { final SyncAdapterType sa = syncAdapters[k]; if (sa.isUserVisible()) { userFacing.add(sa.authority); } } for (int i = 0, count = getPreferenceScreen().getPreferenceCount(); i < count; i++) { Preference pref = getPreferenceScreen().getPreference(i); if (! (pref instanceof AccountPreference)) { continue; } AccountPreference accountPref = (AccountPreference) pref; Account account = accountPref.getAccount(); int syncCount = 0; long lastSuccessTime = 0; boolean syncIsFailing = false; final ArrayList<String> authorities = accountPref.getAuthorities(); boolean syncingNow = false; if (authorities != null) { for (String authority : authorities) { SyncStatusInfo status = ContentResolver.getSyncStatus(account, authority); boolean syncEnabled = ContentResolver.getSyncAutomatically(account, authority) && ContentResolver.getMasterSyncAutomatically()//设置自动同步的地方 && (ContentResolver.getIsSyncable(account, authority) > 0); boolean authorityIsPending = ContentResolver.isSyncPending(account, authority); boolean activelySyncing = currentSync != null && currentSync.authority.equals(authority) && new Account(currentSync.account.name, currentSync.account.type) .equals(account); boolean lastSyncFailed = status != null && syncEnabled && status.lastFailureTime != 0 && status.getLastFailureMesgAsInt(0) != ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS; if (lastSyncFailed && !activelySyncing && !authorityIsPending) { syncIsFailing = true; anySyncFailed = true; } syncingNow |= activelySyncing; if (status != null && lastSuccessTime < status.lastSuccessTime) { lastSuccessTime = status.lastSuccessTime; } syncCount += syncEnabled && userFacing.contains(authority) ? 1 : 0; } } else { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "no syncadapters found for " + account); } } if (syncIsFailing) { accountPref.setSyncStatus(AccountPreference.SYNC_ERROR, true); } else if (syncCount == 0) { accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true); } else if (syncCount > 0) { if (syncingNow) { accountPref.setSyncStatus(AccountPreference.SYNC_IN_PROGRESS, true); } else { accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, true); if (lastSuccessTime > 0) { accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, false); date.setTime(lastSuccessTime); final String timeString = formatSyncDate(date); accountPref.setSummary(getResources().getString( R.string.last_synced, timeString)); } } } else { accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true); } } mErrorInfoView.setVisibility(anySyncFailed ? View.VISIBLE : View.GONE); }
追踪过程中查看的几个类:
ManageAccountsSettings.java//账户设置界面
AccountSyncSettings.java//点击同步Header进入具体同步设置界面
SyncStorageEngine.java (frameworks\base\services\java\com\android\server\content)//用来对同步默认值的设置类
config_syncstorageengine_masterSyncAutomatically//具体值的boolean字串
浙公网安备 33010602011771号