一.需求分析
Android 11.0系统默认的锁屏时钟 年月日 显示的样式不符合需求,现在需要定制化.下图是系统默认的时间样式.
目标是改成这样:
二.核心代码路径
frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
framewors/base/core/res/res/values/donottranslate.xml
frameworks/base/packages/SystemUI/res/values/donottranslate.xml
三.核心代码分析
(1)frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java 中,设置时间样式.
public boolean onCreateSliceProvider() {
mContextAvailableCallback.onContextAvailable(getContext());
inject();
synchronized (KeyguardSliceProvider.sInstanceLock) {
KeyguardSliceProvider oldInstance = KeyguardSliceProvider.sInstance;
if (oldInstance != null) {
oldInstance.onDestroy();
}
//时间样式
mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern);
mPendingIntent = PendingIntent.getActivity(getContext(), 0,
new Intent(getContext(), KeyguardSliceProvider.class), 0);
mMediaManager.addCallback(this);
mStatusBarStateController.addCallback(this);
mNextAlarmController.addCallback(this);
mZenModeController.addCallback(this);
KeyguardSliceProvider.sInstance = this;
registerClockUpdate();
updateClockLocked();
}
return true;
}
(2)查看 R.string.system_ui_aod_date_pattern
frameworks/base/packages/SystemUI/res/values/donottranslate.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Date format for display: should match the lockscreen in /policy. -->
<string name="system_ui_date_pattern" translatable="false">@*android:string/system_ui_date_pattern</string>
<!-- Date format for the always on display. -->
<item type="string" name="system_ui_aod_date_pattern" translatable="false">EEEMMMd</item>
</resources>
(3)查看值为 @*android:string/system_ui_date_pattern 定义的地方
framewors/base/core/res/res/values/donottranslate.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- @hide DO NOT TRANSLATE. Workaround for resource race condition in lockscreen. -->
<bool name="lockscreen_isPortrait">true</bool>
<!-- @hide DO NOT TRANSLATE. Control aspect ratio of lock pattern -->
<string name="lock_pattern_view_aspect">square</string>
<!-- @hide DO NOT TRANSLATE. ICU pattern for "Mon, 14 January" -->
<string name="icu_abbrev_wday_month_day_no_year">EEEMMMMd</string>
<!-- @hide DO NOT TRANSLATE. date formatting pattern for system ui.-->
<string name="system_ui_date_pattern">@string/icu_abbrev_wday_month_day_no_year</string>
<!-- @hide DO NOT TRANSLATE Spans within this text are applied to style composing regions
within an EditText widget. The text content is ignored and not used. -->
<string name="candidates_style" translatable="false"><u>candidates</u></string>
</resources>
可以看到,
<string name="system_ui_date_pattern" translatable="false">EEEMMMMd</string>
(4) 所以,我们可以在这里修改,指定需要的格式为: a eeee MMMd
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Date format for display: should match the lockscreen in /policy. -->
<string name="system_ui_date_pattern" translatable="false">@*android:string/system_ui_date_pattern</string>
<!-- Date format for the always on display. -->
- <item type="string" name="system_ui_aod_date_pattern" translatable="false">EEEMMMd</item>
+ <item type="string" name="system_ui_aod_date_pattern" translatable="false">a eeee MMMd</item>
</resources>
其中:
eeeMMMMd:
"d" : 年月日星期几中的“日”;
“eee” : 年月日星期几中的“星期几”;
“MMMM” : 年月日星期几中的“月”;
The end!