美文网首页
插件化换肤的简介

插件化换肤的简介

作者: 大北小西 | 来源:发表于2020-08-20 15:43 被阅读0次
做好计划,定期复盘,感知责任,提高执行力 换肤有好几种方式,今天主要来看看插件化换肤的相关知识,本文主要涉及到的知识点:
setContentView实现源码分析LayoutInflater中的inflate解析
Observer与ObservableApplication的onCreate的妙用

1.setContentView实现源码分析

setContentView源码分析流程.png 上图为setContentView的一个调用流程,具体可以参考源码做详细分析
布局层级结构.png 2.LayoutInflater中的inflate解析

2.1 对于inflate其主要做以下说明:

 public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
      //此处代码省略
    }

主要是一般在使用是会正常传入root参数,并且attachToRoot为false,如果attachToRoot为ture,有可能会出现设置layout_width参数生效问题(此部分可作为后面的一个补充点做说明)。
另外,会调用createViewFromTag对XML布局进行解析,下面会介绍个这个接口;

2.2 createViewFromTag解析:

    View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
            boolean ignoreThemeAttr) {
        if (name.equals("view")) {
            name = attrs.getAttributeValue(null, "class");
        }

        // Apply a theme wrapper, if allowed and one is specified.
        if (!ignoreThemeAttr) {
            final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);
            final int themeResId = ta.getResourceId(0, 0);
            if (themeResId != 0) {
                context = new ContextThemeWrapper(context, themeResId);
            }
            ta.recycle();
        }

        if (name.equals(TAG_1995)) {
            // Let's party like it's 1995!
            return new BlinkLayout(context, attrs);
        }

        try {
            View view;
            if (mFactory2 != null) {
                view = mFactory2.onCreateView(parent, name, context, attrs);
            } else if (mFactory != null) {
                view = mFactory.onCreateView(name, context, attrs);
            } else {
                view = null;
            }

            if (view == null && mPrivateFactory != null) {
                view = mPrivateFactory.onCreateView(parent, name, context, attrs);
            }

            if (view == null) {
                final Object lastContext = mConstructorArgs[0];
                mConstructorArgs[0] = context;
                try {
                    if (-1 == name.indexOf('.')) {
                        view = onCreateView(parent, name, attrs);
                    } else {
                        view = createView(name, null, attrs);
                    }
                } finally {
                    mConstructorArgs[0] = lastContext;
                }
            }

            return view;
        } catch (InflateException e) {
            throw e;

        } catch (ClassNotFoundException e) {
            final InflateException ie = new InflateException(attrs.getPositionDescription()
                    + ": Error inflating class " + name, e);
            ie.setStackTrace(EMPTY_STACK_TRACE);
            throw ie;

        } catch (Exception e) {
            final InflateException ie = new InflateException(attrs.getPositionDescription()
                    + ": Error inflating class " + name, e);
            ie.setStackTrace(EMPTY_STACK_TRACE);
            throw ie;
        }
    }

从代码看首先会判断mFactory2 ,mFactory 来进行createView即创建view,这两个可谓是作用很大会用来做拦截view的创建过程,从而可以做本文将的重点换肤。心静1秒。。。
3. Observer与Observable
Observer作为被观察者,在换肤中可以用来检测每个Activity的换肤需求,而用来接管系统的View的生产过程的类(SkinLayoutInflaterFactory)即可作为观察者,当当前Activity需要换肤时,通过setChanged()和notifyObservers接口即可通知观察类通过update() 接口进行更新换肤;
4. Application的onCreate的妙用
Application的onCreate()方法调用是早于Anctivity的onCreate(),此点在换肤中的应用是Factory的设置,由自定义Factory来接管,以及会走后面的onCreatView进行新皮肤的加载;另外,比如Gride在第一次调用时会出现加载图片很慢的情况,因为在第一次是Gride会做一些初始化的动作,所以如果出现这种问题,可以考虑在Application的onCreate()中简单做一个Gride的一个初始化init,可以优化此问题。。。。

相关文章

  • 插件化换肤的简介

    换肤有好几种方式,今天主要来看看插件化换肤的相关知识,本文主要涉及到的知识点: 、 、 、 1.setConten...

  • 插件化换肤

    插件化换肤的优点 1)换肤无闪烁,立即生效,无需重启APP,用户体验好2)扩展和维护方便,入侵性小,低耦合3)插件...

  • 初步了解安卓的主题更换

    换肤一般分为两种:插件换肤和主题换肤 插件换肤就是所谓的apk换肤,将需要更换的属性写好打成apk包放在asset...

  • 插件化换肤方案

    插件化换肤,需要考虑两个核心的问题。第一、如何收集到所有需要换肤的View,因为我们需要在换肤的时机中调用这些Vi...

  • 插件化换肤(1)

    如何实现插件化换肤 1.拿到App中要替换的view以及该view在App中的resId 2.通过该view的re...

  • 插件化换肤(2)

    上一篇文章里面我们已经拿到了App中的resId,通过下面的代码: 可以拿到属性的名字和类型,而属性名和类型在Ap...

  • Android Framework层整体执行流程高性能屏幕适配方

    应用场景:自定义View,APK加固,热修复,组件化,插件化,换肤,leakCanary,hilt,jetpack...

  • Android知识点

    1,知识点列表 1.1反射,泛型,源码,设计模式 1.2热更新,热修复,插件化换肤,插件化架构,NDK图片压缩 1...

  • Android热修复原理及实现

    前言 自己之前也做过插件化换肤,涉及到的是插件资源文件的加载;最近看到同事培训的插件化涉及到具体代码的加载;想自己...

  • 插件式换肤

    插件式换肤流程:一:采集需要换肤的控件 SkinLayoutInflaterFactoryonCreateView...

网友评论

      本文标题:插件化换肤的简介

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