Android9锁屏界面时间,android 9.0 SytemUI锁屏界面日期不显示问题

本文探讨了Android系统UI在锁屏界面日期显示的问题。初始状态下,日期在锁屏上显示,但解锁后消失。经过代码分析,发现在`KeyguardSliceView.java`的`showSlice()`方法中控制显示。`subItemsCount > 0`时会显示内容,而`mSlice`在`onChanged`中被赋值,由`refresh()`函数调用的`onChanged`更新。关键变量`mKeyguardSliceUri`在不显示日期的情况下其值为`content://com.android.systemui.keyguard/main`,而显示日期时应为`content://com.android.systemui.keyguard/date`。通过设置`uriString = KeyguardSliceProvider.KEYGUARD_DATE_URI`,可确保每次刷新时显示日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现在第一次开机时,锁屏界面是有日期显示的,然后解过一次锁,日期就不在显示了。

9d040221d54888684fa9fe14a588b6dc.png

是否显示在KeyguardSliceView.java里面控制的,

private void showSlice() {

Trace.beginSection("KeyguardSliceView#showSlice");

if (mPulsing || mSlice == null) {

mTitle.setVisibility(GONE);

mRow.setVisibility(GONE);

if (mContentChangeListener != null) {

mContentChangeListener.run();

}

return;

}

ListContent lc = new ListContent(getContext(), mSlice);

mHasHeader = lc.hasHeader();

ListsubItems = new ArrayList();

for (int i = 0; i < lc.getRowItems().size(); i++) {

SliceItem subItem = lc.getRowItems().get(i);

String itemUri = subItem.getSlice().getUri().toString();

// Filter out the action row

if (!KeyguardSliceProvider.KEYGUARD_ACTION_URI.equals(itemUri)) {

subItems.add(subItem);

}

}

if (!mHasHeader) {

mTitle.setVisibility(GONE);

} else {

mTitle.setVisibility(VISIBLE);

// If there's a header it'll be the first subitem

RowContent header = new RowContent(getContext(), subItems.get(0),

true /* showStartItem */);

SliceItem mainTitle = header.getTitleItem();

CharSequence title = mainTitle != null ? mainTitle.getText() : null;

mTitle.setText(title);

}

mClickActions.clear();

final int subItemsCount = subItems.size();

final int blendedColor = getTextColor();

final int startIndex = mHasHeader ? 1 : 0; // First item is header; skip it

mRow.setVisibility(subItemsCount > 0 ? VISIBLE : GONE); //日期是否显示

......

}

也就说subItemsCount>0时,就会显示,往上面追踪mSlice里面带了date信息时,是没问题的。mSlice是在onChanged里面被赋值的,每次keyguard生成时都会调用onChanged。

@Override

public void onChanged(Slice slice) {

mSlice = slice;

showSlice();

}

接着看代码,onChanged在refresh()函数被调用,mKeyguardSliceUri.toString()在日期显示出来的情况打印出来为content://com.android.systemui.keyguard/date

public void refresh() {

Slice slice;

Trace.beginSection("KeyguardSliceView#refresh");

// We can optimize performance and avoid binder calls when we know that we're bound

// to a Slice on the same process.

if (KeyguardSliceProvider.KEYGUARD_SLICE_URI.equals(mKeyguardSliceUri.toString())) {

KeyguardSliceProvider instance = KeyguardSliceProvider.getAttachedInstance();

if (instance != null) {

slice = instance.onBindSlice(mKeyguardSliceUri);

} else {

Log.w(TAG, "Keyguard slice not bound yet?");

slice = null;

}

} else {

slice = SliceViewManager.getInstance(getContext()).bindSlice(mKeyguardSliceUri);

}

onChanged(slice);

Trace.endSection();

}

这里最为重要的变量mKeyguardSliceUri,这个在setupUri被赋值,没有显示日期的情况,这个值为content://com.android.systemui.keyguard/main

public void setupUri(String uriString) {

if (uriString == null) {

uriString = KeyguardSliceProvider.KEYGUARD_SLICE_URI;

}

boolean wasObserving = false;

if (mLiveData != null && mLiveData.hasActiveObservers()) {

wasObserving = true;

mLiveData.removeObserver(this);

}

mKeyguardSliceUri = Uri.parse(uriString);

mLiveData = SliceLiveData.fromUri(mContext, mKeyguardSliceUri);

if (wasObserving) {

mLiveData.observeForever(this);

}

}

uriString 决定了要更新的内容,在看一下KeyguardSliceProvider.java,这里有好几种类型

public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main";

public static final String KEYGUARD_DATE_URI = "content://com.android.systemui.keyguard/date";

public static final String KEYGUARD_NEXT_ALARM_URI =

"content://com.android.systemui.keyguard/alarm";

public static final String KEYGUARD_DND_URI = "content://com.android.systemui.keyguard/dnd";

public static final String KEYGUARD_ACTION_URI =

"content://com.android.systemui.keyguard/action";

结合上面的,把uriString = KeyguardSliceProvider.KEYGUARD_DATE_URI,改为

uriString = KeyguardSliceProvider.KEYGUARD_DATE_URI

每次refresh()都会更新日期,这样就可以让日期每次都显示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值