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


简单查找

从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 可以 主动抛异常,提醒配置

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏何俊林

结合Android源码分析总结单例模式的几种实现方式

本文为付祥投稿,主要是结合Android源码分析总结单例模式的几种实现方式。 谈起设计模式估计大家都不会陌生,一个项目中至少会用到其中的一种模式,今天要说的主角...

4808
来自专栏码匠的流水账

聊聊spring cloud gateway的SecureHeadersGatewayFilter

本文主要研究下spring cloud gateway的SecureHeadersGatewayFilter

2452
来自专栏菩提树下的杨过

java学习:数据增删改查、存储过程调用及事务处理

为了方便,先定义二个常量: package jmyang.utils; public class ConstDefine { /** * ...

34910
来自专栏向治洪

React Native调用原生组件

在React Native开发过程中,有时候我们可能需要访问平台的API,但react Native还没有相应的实现,或者是React Native还不支持一些...

2458
来自专栏xingoo, 一个梦想做发明家的程序员

【Spring实战】—— 14 传统的JDBC实现的DAO插入和读取

从这篇开始学习Spring的JDBC,为了了解Spring对于JDBC的作用,先通过JDBC传统的流程,实现一个数据库的插入和读取。 从这篇你可以了解到:...

2208
来自专栏别先生

java 使用jdbc连接Greenplum数据库和Postgresql数据库

1、公司使用的Greenplum和Postgresql,确实让我学到不少东西。简单将使用jdbc连接Greenplum和Postgresql数据库。由于使用ma...

3901
来自专栏小巫技术博客

Retrofit2 &amp; RxJava2实现单文件和多文件上传

6054
来自专栏javathings

Spring 中的感知接口

如其名字一样,实现这种接口的 Bean,能自身感知到容器的存在,容器在操作 Bean 的过程中,会调用感知接口中的方法。Spring 设计的这些接口,等于埋下了...

1902
来自专栏闻道于事

JavaWeb(四)JDBC操作Oracle

JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范...

4934
来自专栏向治洪

react native 调用原生UI组件

在React Native开发过程中,有时我们想要使用原生的一个UI组件或者是js比较难以实现的功能时,我们可以在react Naitve应用程序中封装和植入已...

70210

扫码关注云+社区

领取腾讯云代金券