Android开发自学笔记(Android Studio1.3.1)—3.Android应用结构解析
一、R文件是什么?

如上图所示,我们可以通过findViewById方法通过传入R.id.show找到我们的TextView元素,findViewById方法也很好理解,从View中通过Id找到,那么R是什么呢?
资源文件的使用分为在代码中使用和在其他资源文件中引用该资源文件。在我们编译一个Android应用时,Android会自动生成一个R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使用到的所有资源文件的标示,在Android Studio编译环境下,R文件在“D:\UsersFiles\AndroidStudioProjects\MyFirstApp\app\build\generated\source\r\debug\com\example\boyliupan\myfirstapp”目录下(本项目),其中“D:\UsersFiles\AndroidStudioProjects”是我自己定义的工作空间的路径,“MyFirstApp”是我创建的项目名称。
在查询的网络资料和书中
提示R.Java文件存储在“/ge/<package name>”目录下,但是我在Android Studio的编译结果中并没有找到这一项。
我们打开R.java,看一下里面的内容:

其中第1-6行是系统自动生成的注释,说明这是AAPT工具通过它找到的资源数据自动生成的文件,它不能被手动修改(因为你修改了也没用,每次重新生成都会被覆盖)。
AAPT也就是Android Asset Packaging Tool,即Android资源打包工具,通常都是由IDE自动调用,我们不需要手动去使用。
第8-39行就是AAPT自动生成的代码了,该类的名字就是R,其下定义了一些常量。我们可以把R.java理解成资源字典,记录着所有可使用资源的Id,
通过这些Id,我们就可以很方便的在程序中使用这些资源了。
AAPT工具生成R.java文件的规则主要是如下两条:
1.每类资源对对应于R类的一个内部类。比如所有字符串资源对应一个string内部类,所有布局类资源对应于layout内部类。
2.每个具体的资源向对应于内部类的一个public static final int类型的字段,比如我们在示例中定义了show的标识符,我们就可以通过R.Id.show找到。
二、Res目录说明
Res目录存放了Android应用所用的全部资源,包括图片资源、字符串资源、颜色资源等等。其中包含多个目录(这里只说明一部分):
A).其中drawable文件夹用于存储.png、.9.png、.jpg等图片资源(.9.png是Android特有的图片格式,可以根据情况进行拉伸,达到不变形的效果),他们的分变率从高到低,如果你打算在android应用中包含一个图片或者图标,就应该把它们放在这个目录。
B)layout文件夹存放的是应用程序的布局文件,这些layout是以xml形式保存的。C)values 这个目录也包含了一些xml文件,但主要是应用中要引用的key-value对。这些XML文件声明了数组(Array)、颜色(color)、度量(Dimension)、字符串。之所以把这些东西分别放在单独的xml文件中主要是考虑到这些值能够在不更改源代码的情况下用于多语言环境。例如,根据用户语言的不同应用程序中的信息可以有多种语言版本。
Res目录下的资源与R.JAVA的关系
开发者只要编辑Res目录下的资源,R.JAVA根据Res内容完全自动生成,为每个资源分配一个ID,编程时可以通过ID来调用,下面我们会说使用方式。
我们知道资源的使用分为在java代码中使用和在XML文件中引用,下面我们分这两种情况说明一下如何使用:
1.在java代码中使用
这个很简单,我们在前面的例子中已经使用过,直接调用R.id.资源ID就可以调用到(这里演示的是标识符下的资源,如果是字符串资源,就是R.string.资源ID,请自行理解)
2.在XML文件中引用
在XML文件中引用,我们只需要要照着“@<资源对应内部类类名>/<资源项名称>”来访问即可,比如string资源下默认定义了一个app_name的资源我们就可以这样调用“@string/app_name”
3.例外
当我们在XML中使用标识符时,这些标识符不需要使用专门的资源进行定义,我们直接使用“@id/<标识符代号>”来分配标识符即可。
目录资源的访问:
res目录资源通过Resources的相应方法来访问。
相关的信息可以这样获取:
三、AndroidManifest.xml说明
清单文件:这个XML文件包含了android应用中的元信息,是每个android项目中的重要文件。在软件安装的时候被读取 ,Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在该文件中,以及运行这个android应用程序需要的用户权限列表,例如:电话、短信、互联网、访问SD卡,同时也详细描述了android应用的项目结构。通过可以包含如下信息:
1.应用程序的包名,该包名将会作为该应用的唯一标识。
2.应用中所包含的组件,如Activity,Services等等。
3.应用程序兼容的最低版本
4.应用程序使用系统所需的权限声明
5.其它程序访问该应用所需的权限声明
下面是我们示例的清单文件,灰色字体是说明:
四、应用权限的说明及使用
Android应用想要调用某些系统的功能就必须具有相应的权限才可以,比如我们想调用GPS模块,这时我们就必须拥有使用GPS的权限;我们的应用也可能被其他应用调用,这时候也需要声明调用我们的应用需要的权限。
1.运行该应用需要的权限
只需要在清单文件的<manifest../>元素中添加<uses-permission…/>子元素即可。例如:
2.调用我们的应用所需要的权限
声明方法和上述一致,只是声明的位置要放在具体的组件元素节点下。
Android的SDK提供了大量的权限,这些权限都位于Manifest.permission类中,我们常用的权限如下:
|
权限 |
说明 |
| ACCESS_NETWORK_STATE | 允许应用程序获取网络状态 |
| ACCESS_WIFI_STATE | 运行应用程序获取WIFI状态 |
| BATTERY_STATS | 允许应用程序获取电池状态 |
| BLUETOOTH | 允许应用程序连接蓝牙 |
| BLUETOOTH_ADMIN | 允许应用程序发现蓝牙 |
| BROADCAST_SMS | 允许应用程序广播收到短信提醒 |
| CALL_PHONE | 允许应用程序使用拨号功能 |
| CAMERA | 允许应用程序使用摄像头 |
| CHANGE_NETWORK_STATE | 允许应用程序改变网络状态 |
| CHANGE_WIFI_STATE | 允许应用程序改变WIFI状态 |
| DELETE_CACHE_FILES | 允许应用程序删除缓存文件 |
| FLASHLIGHT | 允许应用程序使用闪光灯 |
| INTERNET | 允许应用程序打开网络Socket |
| MODIFY_AUDIO_SETTINGS | 允许应用程序修改全局声音设置 |
| PROCESS_OUTGOING_CALLS | 允许应用程序监听、控制、取消呼出电话 |
| DELETE_PACKAGES | 允许应用程序删除安装包 |
| READ_CONTACTS | 允许应用程序读取联系人 |
| READ_HISTORY_BOOKMARKS | 允许应用程序读取历史书签 |
| READ_OWNER_DATA | 允许应用程序读取用户数据 |
| READ_PHONE_STATE | 允许应用程序读取手机状态 |
| READ_PHONE_SMS | 允许应用程序读取短信 |
| REBOOT | 允许应用程序重启手机 |
| RECEIVE_MMS | 允许应用程序接收、监控、处理彩信 |
| RECEIVE_SMS | 允许应用程序接收、监控、处理短信 |
| RECORD_AUDIO | 允许应用程序使用录音 |
| SEND_SMS | 允许应用程序发送短信 |
| SET_ORIENTATION | 允许应用程序旋转屏幕 |
| SET_TIME | 允许应用程序设置时间 |
| SET_TIME_ZONE | 允许应用程序设置时区 |
| SET_WALLPAPER | 允许应用程序设置壁纸 |
| VIBRATE | 允许应用程序控制振动器 |
| WRITE_CONTACTS | 允许应用程序写入联系人 |
| WRITE_HISTORY_BOOKMARKS | 允许应用程序写入历史书签 |
| WRITE_OWNER_DATA | 允许应用程序写入用户数据 |
| WRITE_SMS | 允许应用程序写短信 |
| 。。。。 | 。。。。。 |
表格取自《疯狂android讲义》后续会做补充完善
五、结语&下篇预告
最近买了一本《疯狂Android讲义》第三版,看了前几章,不得不说,作者很有思想,安排的内容循序渐进,很多内容讲的浅显易懂,读了深有感触,这个系列的文章为读书笔记,会有一些内容参考书中的内容,我认为写的比较实用的地方会总结出来,会有借用部分,向作者致敬,希望有志学习Android开发的同学可以买一本学习学习。
下一篇会简单介绍一下Android开发中常用的组件,概念性的东西,介绍完以后新的篇章会开始Android开发中各个UI组件的学习。
Android开发自学笔记(Android Studio1.3.1)—3.Android应用结构解析的更多相关文章
- Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)
一.引言 本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于Intelli ...
- Android开发自学笔记(Android Studio) 目录
开发环境如下: 操作系统:Windows 10 Pro IDE:Android Studio 1.3.X 或更高版本 其它请参见文章说明. 1. 环境搭建 1.1 (番外)AndroidStudio常 ...
- Android开发自学笔记(Android Studio)—4.1布局组件
一.引言 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.在Android4.0之前,我们通常说 ...
- Android开发自学笔记(Android Studio)—4.5 ProgressBar及其子类
一.前言 ProgressBar本身代表了进度条组件,它还派生出了两个常用的组件:SeekBar和RatingBar,他们的使用方法类似,只是显示界面有一定的区别.我们看一下API文档中的说明: 从图 ...
- Android开发自学笔记(Android Studio)—4.4 AdapterView及其子类
一.引言 AdapterView本身是一个抽象类,而它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. AdapterView具有如下特征: Ada ...
- Android开发自学笔记(Android Studio)—4.3ImageView及其子类
一.引言 ImageView继承自View组件,主要功能用来显示图片,实际上他能显示的不仅是图片,Drawable对象都可以用ImageView来显示. ImageView派生了ImageButton ...
- Android开发自学笔记(Android Studio)—4.2TextView及其子类
一.引言 TextView是我们最常用的一个控件了,它类似于C# Winform程序中的Lable,Java Swing编程中的JLable,不过相对功能更强大些,但从功能上看,它其实就是个文字编辑器 ...
- Android开发自学笔记(Android Studio1.3.1)—1.环境搭建
一.引言 .Google推出的 毫无疑问,这个是它的最大优势,Android Stuido是Google推出,专门为Android"量身订做"的,是Google大力支持的一款基于I ...
- Android开发自学笔记(Android Studio1.3.1)—2.开始第一个Android应用
一.前言 使用Android Studio开发Android应用是一件非常简单的事情,因为它会帮你自动完成很多工作.本篇我们主要完成一个单击按钮在文本框显示当前时间的简单应用,借此来演示一下 ...
随机推荐
- jsp有哪些内置对象?作用分别是什么?分别有什么方法?
JSP共有以下9个内置的对象: request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 sess ...
- Python运算符,python入门到精通[五]
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运算符.赋值运 ...
- html页面高亮关键词
function hightLightTheKeyWord(searchParam,$dom){ if(searchParam&&!/^\s*$/.test(searchParam)) ...
- 深入理解linux系统的目录结构(总结的非常详细)
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- [uwsgi] no request plugin is loaded, you will not be able to manage requests.
Problem: *** Operational MODE: preforking+threaded no app loaded. going in full dynamic mode uWSGI i ...
- 编写NPAPI plugin的命名问题
最近写了个NPAPI的插件,在chrome上用得好好的,结果在火狐上死活不认我的插件,找了N多资料最后在官方的说明里才找到说火狐浏览器的插件的文件名必须是以np开头的,立刻吐血三升,难怪被chrome ...
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- Google类VR设备知识
前言 本文所指的google类vr设备是指: 谷歌的Cardboard.三星Gear VR.暴风魔镜等这样的手机VR盒子,而并不是HTC Vive这类. 人眼立体感知能力 人的左右眼看到的东西是有差别 ...
- Maven学习(七)仓库
* Maven仓库 在项目开发中, 项目目录下往往会有一个lib目录,用来存放第三方依赖jar文件, 如spring log4j jar等文件, Maven仓库就是放置JAR文件(WAR,ZIP,P ...
- SQL 2008 windows登录失败,错误18456, 更正
可能的原因:密码有效性验证失败.该密码太短,不符合 Windows 策略要求. 本地设置可能被域设置覆盖.而域设置中指定了安全策略,密码必须有一定的复杂性.重新更改sa密码. 第一步.以windows ...


