Android4.4 SystemUI分析之Clock时钟显示

SystemUI上的时间显示只要就在/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java类上

效果图

这个类也很简单,监听处理广播

@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();if (!mAttached) {mAttached = true;IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_TIME_TICK);filter.addAction(Intent.ACTION_TIME_CHANGED);filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);filter.addAction(Intent.ACTION_USER_SWITCHED);getContext().registerReceiver(mIntentReceiver, filter, null,getHandler());}// NOTE: It's safe to do these after registering the receiver since the// receiver always runs// in the main thread, therefore the receiver can't run before this// method returns.// The time zone may have changed while the receiver wasn't registered,// so update the TimemCalendar = Calendar.getInstance(TimeZone.getDefault());// Make sure we update to the current timeupdateClock();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();if (mAttached) {getContext().unregisterReceiver(mIntentReceiver);mAttached = false;}}在广播中去更新时间

private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.d(TAG, "action =" + action);if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {String tz = intent.getStringExtra("time-zone");mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));if (mClockFormat != null) {mClockFormat.setTimeZone(mCalendar.getTimeZone());}Log.d(TAG,"mCalendar =" + mCalendar+ "TimeZone.getTimeZone(tz) ="+ TimeZone.getTimeZone(tz));} else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {final Locale newLocale = getResources().getConfiguration().locale;if (!newLocale.equals(mLocale)) {mLocale = newLocale;mClockFormatString = ""; // force refresh}}updateClock();}};在设置中可以改变时间显示是以12小时还是24小时

时间的格式合成都是在这个函数中完成

private final CharSequence getSmallTime() {Context context = getContext();boolean is24 = DateFormat.is24HourFormat(context);LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);final char MAGIC1 = '\uEF00';final char MAGIC2 = '\uEF01';SimpleDateFormat sdf;String format = is24 ? d.timeFormat24 : d.timeFormat12;if (!format.equals(mClockFormatString)) {/** Search for an unquoted "a" in the format string, so we can add* dummy characters around it to let us find it again after* formatting and change its size.*/if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) {int a = -1;boolean quoted = false;for (int i = 0; i < format.length(); i++) {char c = format.charAt(i);if (c == '\&;') {quoted = !quoted;}if (!quoted && c == 'a') {a = i;break;}}if (a >= 0) {// Move a back so any whitespace before AM/PM is also in the// alternate size.final int b = a;while (a > 0&& Character.isWhitespace(format.charAt(a – 1))) {a–;}format = format.substring(0, a) + MAGIC1+ format.substring(a, b) + "a" + MAGIC2+ format.substring(b + 1);}}mClockFormat = sdf = new SimpleDateFormat(format);mClockFormatString = format;} else {sdf = mClockFormat;}String result = sdf.format(mCalendar.getTime());if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) {int magic1 = result.indexOf(MAGIC1);int magic2 = result.indexOf(MAGIC2);if (magic1 >= 0 && magic2 > magic1) {SpannableStringBuilder formatted = new SpannableStringBuilder(result);if (AM_PM_STYLE == AM_PM_STYLE_GONE) {formatted.delete(magic1, magic2 + 1);} else {if (AM_PM_STYLE == AM_PM_STYLE_SMALL) {CharacterStyle style = new RelativeSizeSpan(0.7f);formatted.setSpan(style, magic1, magic2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);}formatted.delete(magic2, magic2 + 1);formatted.delete(magic1, magic1 + 1);}return formatted;}}return result;}

,一直觉得人应该去旅行,在年轻的时候,趁着有脾气装潇洒,

Android4.4 SystemUI分析之Clock时钟显示

相关文章:

你感兴趣的文章:

标签云: