android 监听时钟变化,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;
}
android 监听时钟变化,Android4.4 SystemUI分析之Clock时钟显示相关推荐
- android 监听图库变化,Android ContentObserver 监听图库变化
电脑环境是XP,软件是gVim7.3,安装在C盘的 Program Files 下.如何设置gVim的字体和背景颜色:C---Program Files---Vim---_vimrc文件,用文本编辑器 ...
- 深入分析Android监听网络变化的坑
Android开发的同学都知道,在很多场景下我们需要监听网络变化,从而做一些业务逻辑比如刷新数据.于是我们会找到这样一个广播:ConnectivityManager.CONNECTIVITY_ACTI ...
- android 监听界面变化,Android之页面有变化用onWindowFocusChanged来监听权限是否开启...
1 问题 我们需要在Activity里面监听网络变化.热点是否开启和关闭.GPS服务是否开启.位置权限是否开启等一些列行为. 2 思路 方法一: 如果是需要启动activity进行权限申请,我们可以用 ...
- android监控指纹信息变化,android监听指纹变化(解决反射思路在android10不生效的问题)...
前天偶尔运行代码,一个段异常映入眼帘,我擦android10上反射机制监听不到指纹id等数据了,原因是android10彻底抛弃了之前指纹的api.所以反射不到了. 怎么解决这个问题?我们换个思路当然 ...
- Android 监听网络变化弹出提示窗口
项目有这个需求,监听如果网络断开后3秒内如果没有恢复则弹出网络异常的页面.于是在度娘找了些资料自己写了一个.现在分享一下出现的问题以及解决方法. 1.查到要监听网络需要使用广播接收者.于是摘了一段网上 ...
- android 监听手机电量变化
今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...
- Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动
为了便于进行 系统级别的消息通知,Android引入了一套广播消息机制. 1.广播机制简介: 因为Android中的每个应用程序都可以对自己感兴趣的广播尽心注册,这样程序只会接收自己所关心的广播内容, ...
- Android监听手机网络变化
Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...
- Android 监听系统语言变化
** 监听系统语言变化 ** 监听系统语言变化 首先先创建一个MyApplication继承Application public class MyApplication extends Applica ...
最新文章
- 基于OpenCV的特定区域提取
- vue全家桶+Koa2开发笔记(2)--koa2
- 乐源机器人没电提醒吗_我每天费尽心思,就为了逗一个机器人开心。。
- 使用kubernetes的deployment进行RollingUpdate
- 蓝桥杯_算法训练_关联矩阵
- reactjs生命周期回调(钩子)函数:componentDidMount componentWillUnmount
- java虚拟机的俩种异常
- lombok 自动使用_Lombok,自动值和不可变项
- Jmeter BeanShell学习(一) - BeanShell取样器(一)
- java8-Optional
- 微信收费事件背后被广泛忽略的技术细节
- Uva 10817 校长的烦恼
- 2018-2019-1 20165302 《信息安全系统设计基础》第三周学习总结
- (转) SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程
- 莫烦Python机器学习
- QT 使用全局钩子监听鼠标事件和键盘事件
- 笔记本电脑怎么设置wifi热点共享
- 必须来GeekPwn的十大理由
- Placement blockage types
- BMM 和 FMM 中文分词
热门文章
- sklearn onehot
- xp系统怎么弄清微软服务器名称,xp系统电脑怎么远程云服务器
- python异步写文件_结合异步http请求将数据写入文件
- Leetcode 23 合并k个升序链表 (每日一题 20210722)
- html调试和js脚本调试
- 深度学习应用实战案例-员工流失预测模型(Python源代码)
- 深度学习核心技术精讲100篇(四十四)-深度召回在招聘推荐中的挑战和实践
- MATLAB实战系列(五)-模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解
- 成为指标的“绝地武士”:tableau创建指标的 10 个技巧和窍门
- 深度学习核心技术精讲100篇(十六)-搜索引擎Indri系列之如何建立索引 (Indexing)检索评价 (Evaluation)