当前位置:   article > 正文

Android 设置系统时区的源码追踪_com.android.settings 设置时区

com.android.settings 设置时区

1.TimeZoneFragment中查看具体的点击事件

packages\apps\TvSettings\Settings\src\com\android\tv\settings\system\TimeZoneFragment.java

onCreatePreferences 加载系统的所有时区,并封装成ZonePreference,加到List里

  1. @Override
  2. public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
  3. final Context themedContext = getPreferenceManager().getContext();
  4. final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(
  5. themedContext);
  6. screen.setTitle(R.string.system_set_time_zone);
  7. setPreferenceScreen(screen);
  8. final List<Map<String, Object>> zoneList = ZoneGetter.getZonesList(getActivity());
  9. final List<ZonePreference> zonePrefs = new ArrayList<>(zoneList.size());
  10. for (final Map<String, Object> zone : zoneList) {
  11. zonePrefs.add(new ZonePreference(themedContext, zone));
  12. }
  13. zonePrefs.sort(new ZonePrefComparator());
  14. for (final Preference zonePref : zonePrefs) {
  15. screen.addPreference(zonePref);
  16. }
  17. }

点击事件

  1. @Override
  2. public boolean onPreferenceTreeClick(Preference preference) {
  3. if (preference instanceof ZonePreference) {
  4. // Update the system timezone value
  5. final TimeZoneDetector timeZoneDetector =
  6. getActivity().getSystemService(TimeZoneDetector.class);
  7. ManualTimeZoneSuggestion suggestion = TimeZoneDetector.createManualTimeZoneSuggestion(
  8. preference.getKey(), "Settings: Set time zone");
  9. timeZoneDetector.suggestManualTimeZone(suggestion);
  10. if (getParentFragment() instanceof TwoPanelSettingsFragment) {
  11. ((TwoPanelSettingsFragment) getParentFragment()).navigateBack();
  12. } else if (!getFragmentManager().popBackStackImmediate()) {
  13. getActivity().finish();
  14. }
  15. }
  16. return super.onPreferenceTreeClick(preference);
  17. }

调用了 TimeZoneDetector的suggestManualTimeZone方法来设置时区

frameworks\base\core\java\android\app\timezonedetector\TimeZoneDetector.java是抽象类,

  1. @RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE)
  2. void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion);

具体实现是frameworks\base\core\java\android\app\timezonedetector\TimeZoneDetectorImpl.java

  1. private final ITimeZoneDetectorService mITimeZoneDetectorService;
  2. @Override
  3. public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) {
  4. if (DEBUG) {
  5. Log.d(TAG, "suggestManualTimeZone called: " + timeZoneSuggestion);
  6. }
  7. try {
  8. mITimeZoneDetectorService.suggestManualTimeZone(timeZoneSuggestion);
  9. } catch (RemoteException e) {
  10. throw e.rethrowFromSystemServer();
  11. }
  12. }

frameworks\base\core\java\android\app\timezonedetector\ITimeZoneDetectorService.aidl

  1. interface ITimeZoneDetectorService {
  2. void suggestManualTimeZone(in ManualTimeZoneSuggestion timeZoneSuggestion);
  3. void suggestTelephonyTimeZone(in TelephonyTimeZoneSuggestion timeZoneSuggestion);
  4. }

ITimeZoneDetectorService的具体实现是TimeZoneDetectorService

\frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorService.java

  1. private final TimeZoneDetectorStrategy mTimeZoneDetectorStrategy;
  2. @Override
  3. public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) {
  4. enforceSuggestManualTimeZonePermission();
  5. Objects.requireNonNull(timeZoneSuggestion);
  6. mHandler.post(() -> mTimeZoneDetectorStrategy.suggestManualTimeZone(timeZoneSuggestion));
  7. }

调用了mTimeZoneDetectorStrategy.suggestManualTimeZone(timeZoneSuggestion))方法,而mTimeZoneDetectorStrategy是TimeZoneDetectorStrategy 类,TimeZoneDetectorStrategy是抽象类,具体实现在 TimeZoneDetectorStrategyImpl里

frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorStrategy.java

void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion suggestion);

frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorStrategyImpl.java

  1. @Override
  2. public synchronized void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion suggestion) {
  3. Objects.requireNonNull(suggestion);
  4. String timeZoneId = suggestion.getZoneId();
  5. String cause = "Manual time suggestion received: suggestion=" + suggestion;
  6. setDeviceTimeZoneIfRequired(ORIGIN_MANUAL, timeZoneId, cause);
  7. }

调用 setDeviceTimeZoneIfRequired方法

  1. @GuardedBy("this")
  2. private void setDeviceTimeZoneIfRequired(
  3. @Origin int origin, @NonNull String newZoneId, @NonNull String cause) {
  4. Objects.requireNonNull(newZoneId);
  5. Objects.requireNonNull(cause);
  6. boolean isOriginAutomatic = isOriginAutomatic(origin);
  7. if (isOriginAutomatic) {
  8. if (!mCallback.isAutoTimeZoneDetectionEnabled()) {
  9. if (DBG) {
  10. Slog.d(LOG_TAG, "Auto time zone detection is not enabled."
  11. + " origin=" + origin
  12. + ", newZoneId=" + newZoneId
  13. + ", cause=" + cause);
  14. }
  15. return;
  16. }
  17. } else {
  18. if (mCallback.isAutoTimeZoneDetectionEnabled()) {
  19. if (DBG) {
  20. Slog.d(LOG_TAG, "Auto time zone detection is enabled."
  21. + " origin=" + origin
  22. + ", newZoneId=" + newZoneId
  23. + ", cause=" + cause);
  24. }
  25. return;
  26. }
  27. }
  28. String currentZoneId = mCallback.getDeviceTimeZone();
  29. // Avoid unnecessary changes / intents.
  30. if (newZoneId.equals(currentZoneId)) {
  31. // No need to set the device time zone - the setting is already what we would be
  32. // suggesting.
  33. if (DBG) {
  34. Slog.d(LOG_TAG, "No need to change the time zone;"
  35. + " device is already set to the suggested zone."
  36. + " origin=" + origin
  37. + ", newZoneId=" + newZoneId
  38. + ", cause=" + cause);
  39. }
  40. return;
  41. }
  42. mCallback.setDeviceTimeZone(newZoneId);
  43. String msg = "Set device time zone."
  44. + " origin=" + origin
  45. + ", currentZoneId=" + currentZoneId
  46. + ", newZoneId=" + newZoneId
  47. + ", cause=" + cause;
  48. if (DBG) {
  49. Slog.d(LOG_TAG, msg);
  50. }
  51. mTimeZoneChangesLog.log(msg);
  52. }

最终调用 的是 mCallback.setDeviceTimeZone(newZoneId);

private final Callback mCallback;

Callback是TimeZoneDetectorStrategyImpl.java的内部类,具体实现在TimeZoneDetectorCallbackImpl

frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorCallbackImpl.java

  1. @Override
  2. public void setDeviceTimeZone(String zoneId) {
  3. AlarmManager alarmManager = mContext.getSystemService(AlarmManager.class);
  4. alarmManager.setTimeZone(zoneId);
  5. }

所以应用层调用alarmManager.setTimeZone(zoneId);即可完成时区设置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/294947
推荐阅读
相关标签
  

闽ICP备14008679号