• Android 2.1 和 Android 4.4 工程目录超详细对比及详解


    在搭建Android开发环境及简单地建立一个HelloWorld项目后,本篇将通过HelloWorld项目来介绍Android项目的目录结构。本文的主要主题如下:

    1.1、HelloWorld项目的目录结构(Android 2.1)

    1.1、src文件夹
    1.2、gen文件夹
    1.3、Android 2.1文件夹
    1.4、assets
    1.5、res文件夹
    1.6、AndroidManifest.xml
    1.7、default.properties

    1.2、HelloWorld项目目录结构( Android 4.4)

              (图1)

    下面将分节介绍上面的各级目录结构。

    Android2.1 介绍

    1.1、src文件夹

    顾名思义(src, source code)该文件夹是放项目的源代码的。打开HelloWorld.java文件会看到如下代码:

    package helloworld.test;


    import android.app.Activity;
    import android.os.Bundle;

    public class HelloWorld extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    }

    可以看出,我们新建一个简单的HelloWorld项目,系统为我们生成了一个HelloWorld.java文 件。他导入了两个类android.app.Activity和android.os.Bundle,HelloWorld类继承自Activity且重 写了onCreate方法。

    以下说明针对没有学过Java或者Java基础薄弱的人

    @Override

    在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。 例如,public void onCreate(Bundle savedInstanceState){…….}这种写法是正确的, 如果你写成public void oncreate(Bundle savedInstanceState){…….}这样编译器回报如下错误—— The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method, 以确保你正确重写onCreate方法。(因为oncreate应该为onCreate)

    而如果你不加@Override,则编译器将不会检测出错误,而是会认为你新定义了一个方法oncreate。

    android.app.Activity类:因为几乎所有的活动 (activities)都是与用户交互的,所以Activity类关注创建窗口,你可以用方法setContentView(View)将自己的UI放 到里面。然而活动通常以全屏的方式展示给用户,也可以以浮动窗口或嵌入在另外一个活动中。有两个方法是几乎所有的Activity子类都实现的:

    1、onCreate(Bundle): 初始化你的活动(Activity),比如完成一些图形的绘制。最重要的是,在这个方法里你通常将用布局资源(layout resource)调用setContentView(int)方法定义你的UI,和用findViewById(int)在你的UI中检索你需要编程地 交互的小部件(widgets)。setContentView指定由哪个文件指定布局(main.xml),可以将这个界面显示出来,然后我们进行相关 操作,我们的操作会被包装成为一个意图,然后这个意图对应有相关的activity进行处理。
    2、onPause():处理当离开你的活动时要做的事情。最重要的是,用户做的所有改变应该在这里提交(通常ContentProvider保存数据)。

    更多的关于Activity类的详细信息此系列以后的文章将做介绍,如果你想了解更多请参阅相关文档。

    android.os.Bundle 类:从字符串值映射各种可打包的(Parcelable)类型(Bundle单词就是捆绑的意思,所有这个类很好理解和记忆)。如该类提供了公有方法—— public boolean containKey(String key),如果给定的key包含在Bundle的映射中返回true,否则返回false。该类实现了Parceable和Cloneable接口,所以 它具有这两者的特性。

    1.2、gen文件夹

    该 文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改。R.java文件中定义了一个类——R,R类 中包含很多静态类,且静态类的名字都与res中的一个名字对应,即R类定义该项目所有资源的索引。如下代码片段:

     public static final class layout {
            public static final int activity_hello=0x7f030000;
            public static final int fragment_hello=0x7f030001;
        }

    通过R.java我们可以很快地查找我们需要的资源,另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。

    1.3、Android 2.1文件夹

    该 文件夹下包含android.jar文件,这是一个Java 归档文件,其中包含构建应用程序所需的所有的Android SDK 库(如Views、Controls)和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。例如上面的HelloWorld.java源文件中 的:

    import android.app.Activity;
    import android.os.Bundle;

    这里两行代码就是从android.jar导入包。

    1.4、assets

    包含应用系统需要使用到的诸如mp3、视频类的文件。

    1.5、res文件夹

    资源目录,包含你项目中的资源文件并将编译进应用程序。向此目录添加资源时,会被R.java自动记录。新建一个项目,res目录下会有三个子目录:drawabel、layout、values。

    drawabel-?dpi:包含一些你的应用程序可以用的图标文件(*.png、*.jpg)
    layout:界面布局文件(main.xml)与WEB应用中的HTML类同,没修改过的main.xml文件如下(HelloWorld的就没有修改过):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />
    </LinearLayout>

    values:软件上所需要显示的各种文字。可以存放多个*.xml文件,还可以存放不同类型的数据。比如arrays.xml、colors.xml、dimens.xml、styles.xml
    **

    1.6、AndroidManifest.xml

    项目的总配置文件,记录应用中所使用的各种组件。这个文件列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务(如电话服务、互联网 服务、短信服务、GPS服务等等)。另外当你新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此 Activity。AndroidManifest.xml将包含如下设置:application permissions、Activities、intent filters等。

    HelloWorld项目的AndroidManifest.xml如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="helloworld.test"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".HelloWorld"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    关于AndroidManifest.xml现在就讲这么多,此系列后面的文章将单独详细介绍。

    1.7、 default.properties

    记录项目中所需要的环境信息,比如Android的版本等。

    HelloWorld的default.properties文件代码如下所示,代码中的注释已经把default.properties解释得很清楚了:

    This file is automatically generated by Android Tools.这个文件是由Android工具自动生成的。

    Do not modify this file -- YOUR CHANGES WILL BE ERASED!不要修改这个文件,您的更改将被删除

    This file must be checked in Version Control Systems.这个文件必须签入版本控制系统。

    To customize properties used by the Ant build system use,定制属性使用Ant构建系统用,"build.properties", and override values to adapt the script to your build.properties,并覆盖值的脚本适应你的project structure.项目结构Indicates whether an apk should be generated for each density.表示一个apk是否应该为每个生成的密度

    split.density=false

    Project target.

    target=android-7

    **

    android 4.4

    开发一个项目应该对该项目的目录结构有一个基本的认识,知道每个部分对应的功能及实现。本人学习Android开发便是从这点入手,对项目目录结构有一个整体的认知。本人使用的是Eclipse作为Android的开发环境,所以就用Eclipse生成的Android项目结目录构来讲。

    使用Eclipse生成Android Application Project ,项目名为Application,生成的项目目录结构如上图1所示。

    可以看到在名为Application(项目名)的文件夹下面有src、gen、Android 4.4、libs等文件夹,每一个文件夹都对应有不同的作用。

      其中,src下面放置的是开发人员自己编写的代码,具体内容如下

      com.example.application是当前项目的包名(package name),里面包含了一个MainActivity.java文件,这个文件是当前整个Android项目运行时的入口,有如C语言的Main方法。

      接下来的是gen文件夹,里面的文件是程序自动生成的代码,不用手动修改。里面有两个文件:

      BuildConfig.java是调试(Debug)时用的,一般不管。

      以上的src以及gen可以归类为源码区,除了放置程序自动生成的源码,自己写的代码也几乎是放在src中。

      还有Android 4.4及Android Private Library,两个都是类库,前者是Android类库,后者是新的SDK版本才有的,包含了libs下引入的第三方包。

      Asset里面放置的是视频或者MP3音频等资源文件

      Libs放置的是第三方jar包,但最新版本的ADK下会将这些第三方包转移到Android Private Library里面。

      res也是资源文件的放置位置,和Asset最明显的不同点是res里的资源文件会通过R.java来生成ID,而Asset里的资源文件则不会,具体区别如下:

        在很多时候,我们需要访问android中的资源文件,这些资源文件主要分为两类,一种出于asset目录下,称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的;另一类则是res下的文件,这类文件在打包成apk文件时,会进行小内存优化的哦。

     两种不同类型的文件,对应着不同的访问模式。

    我们先来看看asset文件的访问:

    android中有一个专门的类来处理应用对asset文件的访问,这个类就是AssetManager。其内有一个open()方法可以根据用户提供的文件名,返回一个InputStream对象供用户使用。

    我们截图看下api中的方法:

    这里我们可以看到open方法以及其他的相应方法,对于其中有一个参数accessMode,则指定了系统获取资源的模式。主要值有以下几种:

    ACCESS_BUFFER :加载文件到内存中,这种方式适合小文件的读取;

    ACCESS_RANDOM:可以随意的向前或者向后的读取数据块

    ACCESS_STRAMING:顺序的读取内容

    ACCESS_UNKNOWN:当没有明确指定时,使用默认模式

    这里我们一定要注意,open(String fileName)默认的使用ACCESS_STREAMING模式进行读取!!

    那么我们如何获得一个AssetManager对象呢,在activity中我们可以通过以下的代码获取:

    AssetManager assetManager = this.getResources().getAsset();

    如何访问res目录下的文件呢?

    我们再activity中可以通过如下方法进行访问,InputStream inputStream = Resources.openRawResource(int id);

    api中是这样描述的:

    在res下面还有几个比较重要和常见的文件夹:

      ***drawable-hdpi/drawable-ldpi/drawable-mdpi***:分别放置高、低、中等分辨率的图片,程序会自动根据运行设备的分辨率更换匹配大小的图片。

    注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在res/raw/目录下,这样可以避免被自动优化。

      ***layout:***放置布局文件,布局文件是调整制定Activity的窗口布局文件。

      ***values:***array.xml 定义数组

    colors.xml 定义color drawable和颜色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。

    dimens.xml定义尺寸值(dimension value)。使用Resources.getDimension()获得这些资源。

    strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。

    styles.xml 定义样式(style)对象。

    *res/raw和assets的相同点:两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

    *res/raw和assets的不同点:

    1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

    2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

    *读取文件资源:
    1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
    InputStream is = getResources().openRawResource(R.id.filename);  

    2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

    AssetManager am = null;   
    am = getAssets();   
    InputStream is = am.open("filename");   

    关于Res的特点:res:会在R.java文件下生成标记,这里的资源会在运行打包操作的时候判断哪些被使用到了,没有被使用到的文件资源是不会打包到安装包中的。 在res文件夹下其实还可以定义一下目录: res/anim:这里存放的是动画资源。 res/xml:可以在Activity中使用getResource().getXML()读取这里的资源文件 res/raw:该目录下的文件可以直接复制到设备上,编译软件时,这里的数据不需要编译,直接加入到程序安装包中,使用方法是getResource().OpenRawResources(ID),其中参数ID的形式是R.raw.XXX.

    最后,在项目根目录下,还有一个AndroidMainfest.xml文件。此文件为配置文件,是对整个项目各种配置及设定的描述。

    AndroidMainfest文件的详细情况: AndroidManfest.xml文件包含了项目中所有使用的Activity、Service、Receiver,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.hanfeng.demo"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="8" />  
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".AndroidTest"
                     android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                   <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>  
        </application>
    </manifest>

    【xmlns:android】:包含命名空间的声明。xmlns:android="http://schemas.android.com/apk/res/androidAndroid中各种标准属性能够在文件中使用,提供大部分元素的数据。",使得

    【package】:声明应用程序包。

    【application】:包含package中application级别组件声明的根节点。此元素耶可包含application的一些全局和默认的属性,如标签、icon、主题、必要权限等。一个manifest能够包含零个或一个此元素,不能大于一个。

    【android:icon】:应用程序图标。

    【android:label】:应用程序名字。

    【Activity】:用户交互工具。

    【android:name】:应用程序默认启动的Activity。

    【intent-filter】:声明了指定一组组件支持的Intent值,从而形成IntentFilter。

    【action】:组件支持的Intent action 。

    【category】:组件支持的Intent Category。指定应用程序默认启动的Activity。

    【uses-sdk】: 应用程序所使用的sdk版本。

    【android:versionCode】:主要是用于版本升级所用,是INT类型的,第一个版本定义为1,以后递增,这样只要判断该值就能确定是否需要升级,该值不显示给用户;其实就是更新的次数。

    【android:versionName】:这个是我们常说明的版本号,由三部分组成..,该值是个字符串,可以显示给用户。

    【uses-feature】 如果你是一个Android用户,而且你有一个老旧的安装有android 1.5 的android设备,你可能会注意到一些高版本的应用没有在手机上的Android Market 中显示。这必定是应用使用了的结果。

    Android Market会根据uses-feature过滤所有你设备不支持的应用。通过使用元素,一个应用可以指定它所支持的硬件型号,举个例子,有些设备不支持多点触控或者OpenGL ES 2.0,那么过滤器就会过滤需要这些硬件支持(多点触控或者OpenGL ES 2.0)的应用,用户就不会在android market上看到这些应用。

    一个元素包含以下属性:

    name属性指定了应用的特征,required属性告诉过滤器我们是否在任何情况下必须要需要这个设备的支持,或者仅仅只是“nice to have”。

    最后一个属性是可选择的,只是用在需要指定一个OpenGL ES版本的时候。

    接下来的几个硬件特征对于游戏开发是非常有用的。

    android.hardware.touchscreen.multitouch:它要求设备有一个多点触控的屏幕以支持基本的多点触控交互,就如收缩(放大)图像比例。这些类型的屏幕跟踪多个手指的能力都有所不同,所以你必须确保这个屏幕的性能是能够支持的游戏进行。

    android.hardware.touchscreen.multitouch.distinct: 这是一个多点触控的兄弟属性,它要求提设备供完整的多点触控功能。

    我们将会在接下来的章节片段中看到多点触控。现在只要记住在当你的游戏需要一个支持多点触控的屏幕的时候,我们可以使用 元素来剔除所有不支持多点触控的设备,就像下面这样:

    另外一个在游戏开发中非常有用的是去指定需要的OpenGL ES版本。在本书中,我们只关心OpenGL ES1.0和OpenGL ES1.1就可以了。由于这2者基本上没有什么不同,所以我们也不用去指定了。然而,有些设备支持更强大的OpenGL ES2.0

    如果你的游戏需要更强大的图形处理能力,我们可以指定OpenGL ES 2.0,然后我们的游戏只会被支持OpenGL ES 2.0的设备所看见。注意,在本书中不会使用OPenGL ES 2.0, 我们只是过滤那些不能提供足够图形处理能力的设备。下面显示了我们怎么去实现它。

    它将使我们的游戏只被支持OPenGL ES 2.0 和 假装有相当的图形处理能力的设备所看到。

    NOTE: 有些设备所反映的性能特征是不正确的,所以开发你的应用的时候尽量去支持各种不同的设备。要谨慎使用。

    【supports-screens】

    这个元素用于指定应用程序所支持的屏幕尺寸,并针对比应用程序所支持的屏幕还要大屏幕,启用屏幕兼容模式。在应用程序中使用这个元素指定应用程序所支持的屏幕尺寸是至关重要的。

    如果应用程序调整尺寸属性来填充整个屏幕,那么应用程序就要支持这个给定的尺寸。通常对于大多数应用程序,系统可以很好的完成这种调整工作,并且为了让应用程序在比一个手持设备大的屏幕上工作,你不需要做任何额外的工作。但是,针对不同的屏幕尺寸,通过提供可选的布局资源来优化应用程序的UI经常是很重要的。例如,一个运行在手持设备上的Activity布局,如果想要运行在平板电脑上,就需要修改这个Activity的布局。

    但是,如果为了适应不同的屏幕尺寸而调整了尺寸,但应用程序也不能很好的工作,就可以使用元素的属性来控制应用程序是否应该发布给屏幕较小的设备,或者使用系统的屏幕兼容模式,让UI放大以适应较大屏幕的要求。在没有针对较大屏幕尺寸的设计,并且普通的尺寸不能达到合适结果时,屏幕的兼容模式会通过模拟普通尺寸的屏幕和中等密度来缩放UI,以便它能够填充整个屏幕,这样会导致UI模糊,因此针对大屏幕的优化是比较好的。

    注意:Android3.2引入了新的属性:android:requiresSmallestWidthDp、android:compatibleWidthLimitDp和android:largestWidthLimitDp。如果正在开发Android3.2或更高版本的应用程序,应该使用这些属性来声明应用程序所支持的屏幕尺寸,而不是基于一般的屏幕尺寸属性。

    属性(ATTRIBUTES):

    android:resizeable

    这个属性用于指示针对不同的屏幕尺寸,应用程序是否可以调整尺寸。默认值是true。如果这个属性设置了false,在大的屏幕上,系统会在屏幕兼容模式中运行该应用程序。

    这个属性被废弃了,引入这个属性主要是为了帮助应用程序从1.5过渡到1.6。当多屏幕支持被引入时,就不应该在使用它了。

    android:smallScreens

    这个属性用于指定应用程序是否支持较小外形的屏幕。一个small类型的屏幕被定义成一个比normal(传统的HVGA)类型的屏幕还要小的屏幕。外部服务(如Google Play)不会把不支持小屏的应用程序提供给小屏设备,因为很少有能够确保该应用程序在小屏幕的设备上正常工作的平台。这个属性的默认值是true。

    android:normalScreens

    这个属性用于指示应用程序是否支持普通外形的屏幕。典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被认为是普通屏幕。这个属性的默认值是true。

    android:largeScreens

    这个属性用于指示应用程序是否支持较大外形的屏幕。一个large类型的屏幕被定义成一个比normal类型的手持设备的屏幕明显还要大的屏幕,并且为了让应用程序能够良好的使用,使用这个属性时要特别小心,尽管可以依赖系统来调整尺寸,以便能够填充屏幕。

    这个属性的默认值实际上在某些版本之间是不同的,因此最好在任何时候都明确的声明这个属性。如果设置为false,系统会启用屏幕兼容模式,这时要格外的小心。

    android:xlargeScreens

    这个属性用于指示应用程序是否支持超大外形的屏幕。一个xlarge屏幕被定义成一个比large屏幕还要大的屏幕,如平板电脑,为了能够让应用程序良好的使用,需要特别小心的使用这个属性,尽管可以依赖系统来UI的尺寸来填充屏幕。

    android:anyDensity

    这个属性指明应用程序是否包含了能够适用于任何屏幕密度的资源。

    对于支持Android1.6(API Level 4)和更高版本的应用程序,这个属性的默认值是true,并且除非绝对的确认这是应用程序正常工作所必须的,否则不应该把它设置为false。只是在应用程序直接操作位图时才需要禁止这个属性。

    android:requiresSmallestWidthDp

    这个属性用于指定smallestWidth的最小需求。smallestWidth是屏幕空间的最短尺寸(以dp为单位),它必须是对应用程序的UI是有效的。也就是说它是有效的屏幕的两个维度的尺寸中最短的那个。因此为了考虑设备跟应用程序的兼容性,设备的smallestWidth的值必须要大于等于这个属性所设置的值。通常这个属性值是针对布局所支持的最小宽度,而不是屏幕当前的方向。

    例如,典型的手持设备屏幕smallestWidth是320dp;7英寸的平板电脑的smallestWidth是600dp;10英寸的平板电脑的smallestWidth是720dp。这些值一般都是最小的宽度,因为它们是屏幕可用空间中最短的那个尺寸。

    这对这个尺寸值的比较,需要考虑屏幕的装饰和系统UI部分。例如,如果系统有一些固定的UI元素要显示,那么系统声明的设备的最小宽度(smallestWidth)要比实际的屏幕尺寸要小,因为被系统UI占用的屏幕像素对于应用的UI是无效的。因此,这个值应该是应用布局所使用的最小宽度需求,而不管屏幕的当前方向。

    如果应用程序能够针对较小屏幕尺寸进行正确的调整(small尺寸或最小宽度是320dp以下的屏幕),那么就不需要这个属性。否则就应该使用这个属性值跟应用程序所使用的最小屏幕宽度限定符的值(swdp)相匹配。

    警告:Android系统不会关注这个属性,因此它不会影响应用程序在运行时的行为。相反,它被服务(如Google Play)用于过滤应用程序。但是,当前Google Play不支持用这个属性来过滤(在Android3.2上),因此如果应用程序不支持小屏幕设备,就应该继续使用其他的尺寸属性。 这个属性在API Level 13中被引入。

    android:compatibleWidthLimitDp

    这个属性允许在设计应用程序时,通过指定最大的“smallest screen width”来启用屏幕兼容模式,作为一个用户可选的功能。如果设备的有效屏幕的最小边比这个属性值大,那么用户依然能够安装该应用程序,但是在运行时要使用屏幕兼容模式。默认情况下,屏幕兼容模式似乎被禁止的,并且通过会调整布局的尺寸来填充屏幕,但是在系统栏中会有一个按钮,让用户选择屏幕兼容模式的打开和关闭。

    如果应用程序跟所有的屏幕尺寸都兼容,并且它的布局能够被正确的调整尺寸,就不需要使用这个属性。

    注意:当前,屏幕兼容模式只能模拟320dp宽度的手持设备屏幕,因此如果android:compatibleWidthLimitDp的值比320大,那么屏幕兼容模式就不被适用。

    这个在API Level 13中被引入。

    android:largestWidthLimitDp

    这个属性允许再设计应用程序时,通过指定最大的“smallest screen width”来强制启用屏幕兼容模式。如果设备有效屏幕的最小边比这个属性值大,应用程序就会运行在屏幕兼容模式中,而用户没有办法禁止这种模式。

    如果应用程序跟所有的屏幕尺寸都兼容,并且能够被正确的调整尺寸,就不需使用这个属性。否则首先要考虑使用android:compatibleWidthLimitDp属性。只有在因大屏幕尺寸调整而导致破坏了应用程序的功能的时候,并且使用屏幕兼容模式是唯一的方法的时候,才应该使用这个属性。

    注意:当前,屏幕兼容模式只能模拟320dp宽度的手持设备屏幕,因此如果android:compatibleWidthLimitDp的值比320大,那么屏幕兼容模式就不被适用。

    【uses-permission】与【permission】的区别

    两者之间的不同之一就是,作用域不同,在manifest.xml文件中,是和同级的节点,一般是在后面的。但就不痛了,是定义在和之间,和Activity、Service同级别的,同时使用group的权限组可以大幅减少你同类型相似权限的声明。

    可能就是<uses-permission>是官方定义的权限,<permission>是自己定义的权限。

    在一般情况下实际上不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用这个标签,很显然这个标签可以让我们声明自己程序的权限。

    【uses-library】

    这个元素用于指定该应用程序必须链接的共享类库。这个元素告诉系统该应用程序包的类装载器中所包含的类库代码。

    attributes:

    android:name
        The name of the library. The name is provided by the documentation for the package you are using. An example of this is "android.test.runner", a package that contains Android test classes.
    android:required
        Boolean value that indicates whether the application requires the library specified by android:name:

       "**true**": The application does not function without this library. The system will not allow the application on a device that does not have the library.
       "**false**": The application can use the library if present, but is designed to function without it if necessary. The system will allow the application to be installed, even if the library is not present. If you use "false", you are responsible for checking at runtime that the library is available.

        To check for a library, you can use reflection to determine if a particular class is available.

        **The default is "true".**

    【meta-data】

    语法(SYNTAX):
    被包含于(CONTAINED IN):

    说明(DESCRIPTION): 这个元素用name-value对的格式给其父组件提供任意可选的数据。一个组件元素能够包含任意多个子元素,所有这些元素中定义的值会被收集到一个Bundle对象中,并且提供给组件的PackageItemInfo.metaData属性字段。 通常值是通过其value属性来指定的。但是,也可以使用resource属性来代替,把一个资源ID跟值进行关联。 例如,下面的代码就是把存储在@string/kangaroo资源中的值跟”zoo”名称进行关联:
    另一个方面,使用resource属性会给zoo分配一个数字资源ID,而不是保存在资源中的值。例如:
    要避免使用多个独立的实体来提供相关的数据。相反如果有复杂的数据要跟组件关联,那么把数据作为资源来保存,并使用resource属性,把相关的资源ID通知给组件。 属性(ATTRIBUTES): android:name 针对项目的一个唯一名称。使用Java样式的命名规则,可以确保名称的唯一性,例如: com.example.project.activity.fred。 android:resource 这个属性定义了一个要引用的资源。资源的ID会跟这个项目进行关联。通过Bundle.getInt()方法能够从meta-data的Bundle对象中获取这个ID。 android:value 这个属性会给这个项目分配一个值。下表列出了可能分配的数据的数据类型,以及获取这些数据的方法:

    类型 Bundle对象方法 字符串。对于一个Unicode字符,要使用双斜线()来进行转义,如 和uxxxx getString() 整数值,如100 getInt() 布尔值,true或false getBoolean() 颜色值,如#rgb、#argb、#rrggbb、#aarrggbb getString() 浮点值,如1.23 getFloat()

    1、读取manifest.xml

    PackageManager pm = context.getPackageManager();//context为当前Activity上下文 PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); version = pi.versionName;

    2、在里面定义 android:versionName="@string/app_versionName" 然后在 res/values/strings.xml 里定义一个同名 string item :1.1

  • 相关阅读:
    ubuntu一些记录
    unittest添加测试用例方法
    弹出框处理
    无法连接终端
    Python 断言
    Appium_Python_Api文档
    pycharm快捷键
    appium运行时启动失败
    appium运行时每次默认弹出appiumsetting与unlock重装,关闭这两个步骤的方法
    SpringBoot的jar包引用外部properties文件
  • 原文地址:https://www.cnblogs.com/huangwen/p/3687861.html
Copyright © 2020-2023  润新知