在搭建Android开发环境及简单地创建一个HelloWorld项目后,本篇将经过HelloWorld项目来介绍Android项目的目录结构。本文的主要主题以下:java
1.一、HelloWorld项目的目录结构(Android 2.1)android
1.一、src文件夹
1.二、gen文件夹
1.三、Android 2.1文件夹
1.四、assets
1.五、res文件夹
1.六、AndroidManifest.xml
1.七、default.properties编程
1.二、HelloWorld项目目录结构( Android 4.4)api
(图1)数组
下面将分节介绍上面的各级目录结构。app
Android2.1 介绍ide
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子类都实现的:
一、onCreate(Bundle): 初始化你的活动(Activity),好比完成一些图形的绘制。最重要的是,在这个方法里你一般将用布局资源(layout resource)调用setContentView(int)方法定义你的UI,和用findViewById(int)在你的UI中检索你须要编程地 交互的小部件(widgets)。setContentView指定由哪一个文件指定布局(main.xml),能够将这个界面显示出来,而后咱们进行相关 操做,咱们的操做会被包装成为一个意图,而后这个意图对应有相关的activity进行处理。
二、onPause():处理当离开你的活动时要作的事情。最重要的是,用户作的全部改变应该在这里提交(一般ContentProvider保存数据)。
更多的关于Activity类的详细信息此系列之后的文章将作介绍,若是你想了解更多请参阅相关文档。
android.os.Bundle 类:从字符串值映射各类可打包的(Parcelable)类型(Bundle单词就是捆绑的意思,全部这个类很好理解和记忆)。如该类提供了公有方法—— public boolean containKey(String key),若是给定的key包含在Bundle的映射中返回true,不然返回false。该类实现了Parceable和Cloneable接口,因此 它具备这二者的特性。
1.二、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.三、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.四、assets
包含应用系统须要使用到的诸如mp三、视频类的文件。
1.五、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.六、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.七、 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.四、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字符,要使用双斜线(\)来进行转义,如\n和\uxxxx getString() 整数值,如100 getInt() 布尔值,true或false getBoolean() 颜色值,如#rgb、#argb、#rrggbb、#aarrggbb getString() 浮点值,如1.23 getFloat()
一、读取manifest.xml
PackageManager pm = context.getPackageManager();//context为当前Activity上下文 PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); version = pi.versionName;
二、在里面定义 android:versionName="@string/app_versionName" 而后在 res/values/strings.xml 里定义一个同名 string item :1.1