发现在第一次开机时,锁屏界面是有日期显示的,然后解过一次锁,日期就不在显示了。
是否显示在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()都会更新日期,这样就可以让日期每次都显示了。