android 9.0 SytemUI锁屏界面日期不显示问题

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

android 9.0 SytemUI锁屏界面日期不显示问题_第1张图片

是否显示在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();
        List subItems = 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()都会更新日期,这样就可以让日期每次都显示了。

你可能感兴趣的:(android 9.0 SytemUI锁屏界面日期不显示问题)