美文网首页Android安全-源码分析Android知识android源码解析
鸿洋AutoLayout代码分析(二):获取Manifest中的

鸿洋AutoLayout代码分析(二):获取Manifest中的

作者: dodo_lihao | 来源:发表于2016-09-10 11:07 被阅读1029次

    简单查找

    从AndroidManifest.xml中去取值,自己觉得应该和 PackageManager 或 Manifest 有关
    (Manifest 简单是一个容器,存储和读写键值对用的, PackageManager 是抽象类,自己还没有了解过对应的实现)

    因为上一节有提到过唯一的Activity,AutoLayoutActivity
    我们 写一个引用 PackageManager pm,
    找一下对应的 useages 使用

    Paste_Image.png

    我们可以找到对应的地方
    也就是 AutoLayoutConifg 类的, getMetaData(Context context) 私有方法
    (AutoLayoutConifg 拼写错位了, 应该是 大神写的比较急, 按快了造成的)


    Paste_Image.png

    AutoLayoutConifg 类

    (AutoLayoutConifg 拼写错位了, 应该是 大神写的比较急, 按快了造成的)
    我们先一起看一下大体结构
    在android studio中的左侧,点击 Structure
    点击 【P】 和 【锁】
    (具体含有如果不清楚,可以参考 http://www.jianshu.com/p/739c8414109d

    Paste_Image.png

    再参考类的前面部分

    Paste_Image.png

    除了那个boolean 的属性
    我们可以大体看见
    4个get方法,其实就是 获取对应的 4个属性值
    也就是对应的屏幕宽高, 设计的宽高

    再看对应的静态对象,私有构造,instance方法
    我们可以知道是对应的 饿汉单例

    去掉先说的 ,暂时不考虑的 useDeviceSize() 方法以外
    还有 init(Context context) , getMetaData(Context context),checkParams()
    这3个方法


    其他3个方法
    checkParams()

        public void checkParams() {
            if (mDesignHeight <= 0 || mDesignWidth <= 0) {
                throw new RuntimeException(
                        "you must set " + KEY_DESIGN_WIDTH + " and " + KEY_DESIGN_HEIGHT + "  in your manifest file.");
            }
        }
    

    我们可以知道是对应的 抛异常方法,
    也就是 如果 mDesignHeight <= 0 || mDesignWidth <= 0
    主动抛异常

    init(Context context)

        public void init(Context context) {
            getMetaData(context);
    
            int[] screenSize = ScreenUtils.getScreenSize(context, useDeviceSize);
            mScreenWidth = screenSize[0];
            mScreenHeight = screenSize[1];
            L.e(" screenWidth =" + mScreenWidth + " ,screenHeight = " + mScreenHeight);
        }
    

    调用getMetaData(context);后
    依赖 ScreenUtils类, 获取 mScreenWidth 和 mScreenHeight。
    并且赋值

    getMetaData(Context context)

        private void getMetaData(Context context) {
            PackageManager packageManager = context.getPackageManager();
            ApplicationInfo applicationInfo;
            try {
                applicationInfo = packageManager.getApplicationInfo(context
                        .getPackageName(), PackageManager.GET_META_DATA);
                if (applicationInfo != null && applicationInfo.metaData != null) {
                    mDesignWidth = (int) applicationInfo.metaData.get(KEY_DESIGN_WIDTH);
                    mDesignHeight = (int) applicationInfo.metaData.get(KEY_DESIGN_HEIGHT);
                }
            } catch (PackageManager.NameNotFoundException e) {
                throw new RuntimeException(
                        "you must set " + KEY_DESIGN_WIDTH + " and " + KEY_DESIGN_HEIGHT + "  in your manifest file.", e);
            }
    
            L.e(" designWidth =" + mDesignWidth + " , designHeight = " + mDesignHeight);
        }
    

    依赖 PackageManager 和 ApplicationInfo 这2个类去获得
    AndroidManifest.xml文件中,对应的 meta-data 值

    Paste_Image.png

    当然,如果没有配置,对应的try... catch 可以 主动抛异常,提醒配置


    下一篇我们可以了解鸿洋AutoLayout代码分析(三):入口类分析

    相关文章

      网友评论

        本文标题:鸿洋AutoLayout代码分析(二):获取Manifest中的

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