美文网首页
Android之插件换肤(一)

Android之插件换肤(一)

作者: Ayres | 来源:发表于2018-03-06 15:29 被阅读0次

1.布局创建流程(源码)

图片.png

2.资源加载流程(源码)

图片.png

介绍LayoutInflater

图片.png
图片.png

1.资源加载

ImageView的src加载图片:

public ImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
        int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);

    initImageView();

    final TypedArray a = context.obtainStyledAttributes(
            attrs, R.styleable.ImageView, defStyleAttr, defStyleRes);

    final Drawable d = a.getDrawable(R.styleable.ImageView_src);
     ...........
    }

其中 final Drawable d = a.getDrawable(R.styleable.ImageView_src); 进入

@Nullable
 public Drawable getDrawable(@StyleableRes int index) {
    if (mRecycled) {
        throw new RuntimeException("Cannot make calls to a recycled instance!");
    }

    final TypedValue value = mValue;
    if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) {
        if (value.type == TypedValue.TYPE_ATTRIBUTE) {
            throw new UnsupportedOperationException(
                    "Failed to resolve attribute at index " + index + ": " + value);
        }
        return mResources.loadDrawable(value, value.resourceId, mTheme);
    }
    return null;
}

调用mResources.loadDrawable(value, value.resourceId, mTheme);来加载资源,mResources也就是Resources

             private final Resources mResources;

再如:

  getResources().getColor(R.color.colorAccent);

也是Resources

 @ColorInt
 @Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}
Resources创建

点击进入

@Override
 public Resources getResources() {
    if (mResources == null && VectorEnabledTintResources.shouldBeUsed()) {
        mResources = new VectorEnabledTintResources(this, super.getResources());
    }
    return mResources == null ? super.getResources() : mResources;
}

进入

 private Resources getResourcesInternal() {
    if (mResources == null) {
        if (mOverrideConfiguration == null) {
            mResources = super.getResources();
        } else {
            final Context resContext = createConfigurationContext(mOverrideConfiguration);
            mResources = resContext.getResources();
        }
    }
    return mResources;
}

进入

 @Override
 public Resources getResources() {
    return mBase.getResources();
}

最终进入Context的抽象方法

 public abstract Resources getResources();

寻找实现类;sdk源码中搜索ContextImpl打开,ContextImpl就是Context的实现类
搜索mResources赋值

 private ContextImpl(ContextImpl container, ActivityThread mainThread,
        LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted,
        Display display, Configuration overrideConfiguration, int createDisplayWithId) {
    mOuterContext = this;

   .........省略.............

    Resources resources = packageInfo.getResources(mainThread);
    if (resources != null) {
        if (displayId != Display.DEFAULT_DISPLAY
                || overrideConfiguration != null
                || (compatInfo != null && compatInfo.applicationScale
                        != resources.getCompatibilityInfo().applicationScale)) {
            resources = mResourcesManager.getTopLevelResources(packageInfo.getResDir(),
                    packageInfo.getSplitResDirs(), packageInfo.getOverlayDirs(),
                    packageInfo.getApplicationInfo().sharedLibraryFiles, displayId,
                    overrideConfiguration, compatInfo);
        }
    }
    mResources = resources;

      .........省略.............
}

Resources resources = packageInfo.getResources(mainThread);进入LoadedApk


image.png

调用ActivityThread的


image.png
进入ResourcesManager 可知是通过new的方式实例化
image.png

2.加载资源实现

image.png

相关文章

网友评论

      本文标题:Android之插件换肤(一)

      本文链接:https://www.haomeiwen.com/subject/bpdlfftx.html