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

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

技术分享

效果图

技术分享

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

@Override
	protected 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 Time
		mCalendar = Calendar.getInstance(TimeZone.getDefault());

		// Make sure we update to the current time
		updateClock();
	}

	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		if (mAttached) {
			getContext().unregisterReceiver(mIntentReceiver);
			mAttached = false;
		}
	}
在广播中去更新时间

private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
		@Override
		public 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;

	}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。