背景:时间格式有12//24小时制,系统设置时间格式之后,状态栏和锁屏的时间显示也会相应的发生变化,但是现在发现一个问题:当我切换到多用户设置时间格式的时候发现,状态栏的时间格式变化正常,但是锁屏时间格式,只会随着主用户的时间格式进行变化。基于这个现象,我就去朝看锁屏时间格式设置的相关流程代码。

使用的时间格式,有个对应的字段值进行存储,存储在Settings.System.TIME_12_24字段里,如果锁屏需要刷新时间格式,大概会监听这个字段,所以我根据这个字段查看锁屏相关代码对它的监听。
1.frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java

       mTimeFormatChangeObserver = new ContentObserver(mHandler) {@Overridepublic void onChange(boolean selfChange) {mHandler.sendMessage(mHandler.obtainMessage(MSG_TIME_FORMAT_UPDATE,Settings.System.getString(mContext.getContentResolver(),Settings.System.TIME_12_24)));}};mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.TIME_12_24),false, mTimeFormatChangeObserver, UserHandle.USER_ALL);

根据MSG_TIME_FORMAT_UPDATE,查看到:

    /*** Handle (@line #MSG_TIME_FORMAT_UPDATE}** @param timeFormat "12" for 12-hour format, "24" for 24-hour format*/private void handleTimeFormatUpdate(String timeFormat) {Assert.isMainThread();if (DEBUG || true) Log.d(TAG, "handleTimeFormatUpdate timeFormat=" + timeFormat);for (int i = 0; i < mCallbacks.size(); i++) {KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();if (cb != null) {if (DEBUG || true) Log.d(TAG, "cb != null   mCallbacks.size() = "+mCallbacks.size()+";");cb.onTimeFormatChanged(timeFormat);}}}

cb.onTimeFormatChanged(timeFormat);
2.frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java

    private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {@Overridepublic void onLockScreenModeChanged(int mode) {mKeyguardSliceViewController.updateLockScreenMode(mode);}@Overridepublic void onTimeChanged() {refreshTime();}@Overridepublic void onTimeFormatChanged(String timeFormat) {Log.d("time_12","onTimeFormatChanged");mKeyguardClockSwitchController.refreshFormat();}@Overridepublic void onTimeZoneChanged(TimeZone timeZone) {mKeyguardClockSwitchController.updateTimeZone(timeZone);}@Overridepublic void onKeyguardVisibilityChanged(boolean showing) {if (showing) {if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing);refreshTime();}}@Overridepublic void onUserSwitchComplete(int userId) {Log.d("time_12","onUserSwitchComplete");mKeyguardClockSwitchController.refreshFormat();}};

在frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java定义了方法

    /*** Called when time format changes.*/public void onTimeFormatChanged(String timeFormat) { }

根据mKeyguardClockSwitchController.refreshFormat();

3.frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java

    void refreshFormat() {Log.d("time_12","refreshFormat    1111");if (mClockViewController != null) {Log.d("time_12","refreshFormat    2222");mClockViewController.refreshFormat();mLargeClockViewController.refreshFormat();}}

mClockViewController.refreshFormat();
4.frameworks/base/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java

    /*** Trigger a time format update*/public void refreshFormat() {Log.d("TIME_12","refreshFormat");mView.refreshFormat();}

mView.refreshFormat();
5.frameworks/base/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java

    void refreshFormat() {Patterns.update(mContext);final boolean use24HourFormat = DateFormat.is24HourFormat(getContext());Log.d("TIME_12","use24HourFormat  =  "+use24HourFormat+";");//context.getUserId()Log.d("TIME_12","getUserId  =  "+getContext().getUserId()+";");if (mIsSingleLine && use24HourFormat) {mFormat = Patterns.sClockView24;} else if (!mIsSingleLine && use24HourFormat) {mFormat = DOUBLE_LINE_FORMAT_24_HOUR;} else if (mIsSingleLine && !use24HourFormat) {mFormat = Patterns.sClockView12;} else {mFormat = DOUBLE_LINE_FORMAT_12_HOUR;}mDescFormat = use24HourFormat ? Patterns.sClockView24 : Patterns.sClockView12;Log.d("TIME_12","mDescFormat  =  "+mDescFormat+";");refreshTime();}

至此大概能看到打开关闭24小时制开关时,对锁屏界面的一个刷新过程,主用户打开关闭此开关会正常刷新。但是我发现其他用户对此开关的开关,则只会在第一步正常的监听和获取新的小时制12或者24。但是无法响应刷新,也就是在cb.onTimeFormatChanged(timeFormat);处发现对应的方法内的log没打出来。另外在查看frameworks/base/core/java/android/text/format/DateFormat.java里的方法,

    /*** Returns true if times should be formatted as 24 hour times, false if times should be* formatted as 12 hour (AM/PM) times. Based on the user's chosen locale and other preferences.* @param context the context to use for the content resolver* @return true if 24 hour time format is selected, false otherwise.*/public static boolean is24HourFormat(Context context) {return is24HourFormat(context, context.getUserId());}

我发现每次获取的都是主用户的时间格式,context.getUserId()为0。
此问题大概是多用户的设计就是这样的,根本原因我还没查到,只是查看到此流程以及发现这些问题和现象,对比Android12原声机的现象亦是如此。

锁屏时间格式不随多用户的时间格式变化而变化?相关推荐

  1. 笔记本一锁屏程序就结束(锁屏程序结束、锁屏程序退出)(在此时间后关闭硬盘、硬盘关闭)(计算机空闲状态)

    笔记本一锁屏程序就结束原因 问题背景 问题原因 在此时间后关闭硬盘 何为"空闲状态"? 解决办法 问题背景 我用向日葵开了个远程连接我家里的电脑,但是我的笔记本一锁屏,过了一会回来 ...

  2. 如何使锁屏界面的日期按照设置中的日期格式显示

    android6.0上 最近客户有个需求 锁屏界面上的日期不随日期格式的改变而改变, 而在原生的6.0系统上 日期和时间里 没有选择日期格式这一项,所以必须在加了这一项基础上 (客户需求已实现) 写一 ...

  3. 解决win10笔记本电脑开机要黑屏一段时间才显示锁屏界面的方案

    本人使用的电脑为华硕笔记本,核显+独显,全是英特尔平台 首先这个问题不大,但是每次开机动画后就黑屏需要等很久才能进入锁屏界面然后开启系统,赶时间的话真的让人心烦 我实在受不了了... 我查了几种方案全 ...

  4. 计算机锁屏之后QQ音乐停止播放了,win10在锁屏后怎样设置才能继续播放音乐

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:win10在锁屏后怎样设置才能继续播放音乐回答:打开控制面板 然后我们找到硬件和声音,进入.继续,选择下方的电源选项,进入. 然后, ...

  5. Win11锁屏快捷键是什么 Win11锁屏的方法

    在办公的时候,想要短暂离开一会电脑,但是又不想被别人看见自己的电脑内容,就可以使电脑进入锁屏状态.但是如果等待电脑自动进入锁屏状态需要等上一段时间,那就可以使用锁屏快捷键来帮助电脑快速锁屏.下面我们就 ...

  6. 安卓桌面壁纸_教你一分钟定制你的个性锁屏桌面壁纸(安卓+ios)

    --------  点击上方蓝字,轻松关注我们  -------- 教你一分钟定制你的个性锁屏桌面壁纸 ★特色: ☆定制锁屏:强大功能,锁屏和解锁样式都可用照片和文字重新定义 ☆保护隐私:除了滑动锁, ...

  7. android 魔力锁屏源码,打造最炫手机锁屏桌面 10款安卓魔力锁屏主题推荐

    安卓魔力锁屏主题:个性情侣锁屏 这又是一款非常新潮的安卓魔力锁屏主题.锁屏界面上有一对情侣拿着手枪,界面展现方式与iPhone的非常相似.解锁方式采用的是屏幕下端横向拉动解锁. 安卓魔力锁屏主题:个性 ...

  8. App 锁屏的时候显示App的内容

    如题,app 锁屏的时候,等解锁的时候需要显示出来app的壁纸,类似与网易云的锁屏音乐就是一个壁纸显示 首先需要一个允许一个程序打开窗口使用TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层 ...

  9. 锁定计算机时候的屏幕壁纸,电脑锁屏的时候屏幕壁纸怎么更改

    满意答案 Liansnnn 2017.01.05 采纳率:54%    等级:9 已帮助:1812人 1.如何更换Win8锁屏壁纸 在Win8开始屏幕或者桌面界面上,将鼠标移动到桌面最右侧右下角,即可 ...

最新文章

  1. Python基础总结(2)
  2. mysql 8.0免安装配置_Mysql8.0免安装包配置方法
  3. torch 使用hdf5训练
  4. 已拦截跨源请求:同源策略禁止读取位于XXXXXXXXXXXXXXXX/demo_test.txt 的远程资源。(原因:CORS 请求不是 http)
  5. Grace Ex助力区块链数字资产迈向全新未来
  6. python 设计模式之组合模式Composite Pattern
  7. anaconda安装——添加镜像源
  8. 【渝粤题库】陕西师范大学201831 课程论 作业
  9. 如何在SqlServer中快速有条件删除海量数据
  10. mysql 该字符串未被识别为有效的 datetime_打印报错,提示该字符串未被识别为有效的datetime...
  11. 计算机专业方面的期刊介绍
  12. 有线与无线网络配置相关工具
  13. ubuntu pip安装xgboost
  14. 无线通信设备安装工程概预算编制_安装造价工程 电气安装预算编制
  15. Unity的PackageManager面板不能用问题
  16. 资料分析-第一章-统计术语
  17. gitter 卸载_最佳Gitter频道:数学
  18. 经纬度 在线计算距离
  19. MPC5748G开发笔记-----MPC5748G程序跑飞uSDHCDriverIRQHandler
  20. mmap(内存映射)、sendfile() 与零拷贝技术

热门文章

  1. java tire树_Java实现Tire
  2. 计算机技术业余爱好者的感慨!!!(新开通博客,欢迎大家参观~)
  3. 领略集成灶品牌排名,集成灶好还是油烟机好?森歌给你答案
  4. 男人必吃的12种健康食物,程序员更得看看!
  5. 用code2vec、glow和spaCy进行词嵌入
  6. MGV2000_BYT代工_刷机固件包
  7. 基于组合优化的出租车订单调度模型
  8. C# 粘连窗体效果(窗体连动 类似千千静听播放器的)
  9. 89c51汇编语言波形发生器,51单片机汇编语言实现波形发生器
  10. 惠普台式计算机硬盘拆卸方法,简单的拆解二_惠普 EliteDesk 800 G1 DM_台式电脑评测-中关村在线...