HelloWorld工程项目解析(四)

来源:互联网 发布:左轮吉他淘宝店怎么样 编辑:程序博客网 时间:2024/06/08 18:35

前言

前面我们已经利用AS创建了一个HelloWorld的项目,各位都是学过java的人,相比对java项目已经够了解了吧。Java项目包含的东西不多,一个libs目录,一个src目录,基本上就没啥了。如果你认为android项目和Java项目一样简单,那你就打错特错了。android项目里面大有文章。今天我们就来带着大家一起了解一下android项目中到底有什么。
如下是一个入门项目HelloWorld的项目结构图

首先我们来看一看android项目整体架构

  1. 最顶层带有一个杯子的HelloWorld字样,他是我们这个项目的工作空间(也就是Project),相当于eclipse的workspace,与eclipse不同的是,eclipse在一个工作空间中,可以并且推荐将很多的项目放在一个workspace中,但是androidstudio不推荐这样做,一个项目对应一个Project,一个Project里面推荐只包含一个Module(也就是eclipse中的project)。是不是觉得会有点绕?不要紧,你只需要记住,在androidstudio中,工作空间就是Project, 项目本身就是一个Module。
  2. 接下来说说带有一个小手机字样的文件夹,默认名字是app,这也就是我们的项目了。注意:这个是你新建项目的时候,IDE帮你自动去取的名字,这个名字是可以更改的,不过一般不会有人去选择更改这个名字,因为这个名字取什么和项目本身没有任何关系。
  3. build文件夹。系统编译过后的文件都放在这里,比如默认签名的apk文件等等。不需要过多关注。
  4. libs: 和eclipse一样,是存放jar包的文件夹。不过用了as后,你应该会更习惯用依赖,而不是用jar包。用jar包的麻烦我想不必我多说了吧。最典型的一个就是更新问题,如果jar包更新了,你需要在去下载jar包,然后放入libs文件夹。而用了依赖的方式,jar包更新了,我们只需要更改一下依赖的版本号即可。
  5. src: 这个就是源文件夹了。和eclipse一样,没什么区别。
  6. androidTest:android单元测试文件夹,一般新建项目都会默认生成单元测试文件夹,现在是初级阶段,我们暂时不考虑单元测试的问题。
  7. main:这个文件夹下面,还有一个java子目录,点开开一下,恩。里面有一个java文件夹。我想这个就不用我多说了吧。存放java代码。基本上业务功能都会在这里实现。
  8. res:同样也在main文件夹下,这个是资源文件夹,存放音频,图片,视频,声音,以及各种形式xml文件等,这个比较重要,在后面我们单开一个小结着重讲解资源文件夹;
  9. AndroidManifest.xml:android项目的清单文件,一些比较重要的配置都在这个xml文件夹中配置。例如项目图标,app名称,四大组件等等。。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定新建项目时指定的程序最低兼容版本和目标版本。由于这个文件我们用到的比较多,后面我们在使用的时候在进行详细的说明。
  10. test:测试用例
  11. build.gradle: 项目的构建脚本,和module在同一级,当然,整个Project肯定不止这一个gradle文件,我们可以在与Project同级别的文件夹中寻找,会发现在Project文件夹同级中,也有一个gradle文件,除此之外,还有一个gradle,当然这个不是我们关心的内容,我们主要关注module中的build.gradle文件和与Projec同级别的gradle文件。
    1. 与module同级的gradle文件,这个是项目的构建脚本。里面包含了项目的版本信息,混淆信息,签名信息,依赖关系等等。
    2. 与Project同级的gradle文件,这个是Project的构建脚本,里面包含了构建Project的一些基本信息。
  12. proguard-rules.pro:打包混淆的混淆规则。

资源文件夹–res

  1. 说起res文件夹,其实和它同级的还可以有一个文件夹,叫做assets,这个默认是没有的,但是我们可以新建该文件夹,assets目录也是叫做资源文件夹,既然都是资源文件夹,那么两者有什么区别呢?我认为最主要的区别就在于res下的资源文件都会在R.java文件种找到对应的资源id,而assets文件夹并不会出现这样的情况。res可以直接通过资源id找到对应的资源文件,而assets文件夹里面的资源如果需要访问,需要通过AssetsManager以二进制流的形式来读取!R.java文件是自动生成的,一般不要去尝试改动R.java文件,如果你的项目中引用R文件报错,阿么很有可能就是你的资源文件出了问题!

先说一下图片资源

  1. drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件。
  2. mipmap:你可能会看到很多个以mipmap文件开头的文件夹。他们分别代表了不同的分辨率;
    1. drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件
    2. mipmap-hdpi:高分辨率,一般我们把图片丢这里
    3. mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧
    4. mipmap-xhdpi:超高分辨率,
    5. mipmap-xxhdpi:超超高分辨率,
    6. 注意:mipmap文件夹好像是不能存放.9图片的,.9图片存放在mipmap文件夹编译会报错。这点as做的不太好。mipmap文件夹在eclipse上是没有的,eclipse有以drawable开头的各种分辨率的文件夹,而as默认是有以mipmap开头的各种分辨率的文件夹,不过我们也可以在androidstudio中手动创建以drawable开头的各种分辨率的文件夹。这个是没有任何问题的。

布局资源

  1. layout:这个文件夹存放的所有xml布局文件,如果需要兼容比较奇葩版本的手机,我们可以为那些手机另外做一套布局,名字就叫layout-xx,例如我们要创建480×800分辨率的文件夹,我们可以命名成layout-480×800。

菜单资源

  1. menu: 这个文件夹存放的就是目录菜单资源,这个文件夹主要是针对带有实体菜单按键这样的手机定制的,这个文件夹不用太过关注,因为现在大多数手机都去掉了实体按键,基本上都改成了虚拟按键,所以这个文件夹没有什么功能,不过如果以后要适配带实体菜单键的手机,这个文件夹还是要关注滴。

values目录

  1. dimens.xml:定义尺寸资源,主要是为了屏幕适配。
  2. colors.xml:定义颜色资源
  3. string.xml:定义字符串资源
  4. style.xml:定义样式资源
  5. arrays.xml:定义数组资源
  6. attrs.xml:自定义控件时用的较多,自定义控件的属性!

raw目录

这个主要是存放各种原生资源(我主要存放过音频资源,据说也可以存放xml,这个我没有深究过),当时存放音频资源主要是当时手头有一个项目,需求是按键需要有声音,当时按键的声音资源文件就放在这个文件夹中。

使用资源文件中的资源

上面我们已经将资源文件的介绍说完了,下面我们来继续说说如何去使用这些资源文件。在前面我们已经说了,所有的资源文件都会在R.java文件中生成一个唯一的资源id,我们可以通过资源id来访问这个资源文件。主要访问方式有如下两种:

使用java代码访问

获取控件

TextView mtvText = (TextView) findViewById(R.id.tv_text);

访问string.xml:

mtvText.setText(getResources().getString(R.string.app_name2));
mtvText2.setText(getResources().getText(R.string.app_name2));

访问图片

mtvText2.setBackgroundResource(R.mipmap.ic_launcher);

访问颜色

mtvText2.setTextColor(getResources().getColor(R.color.colorAccent));

访问布局

setContentView(R.layout.activity_main);

在xml中访问

在xml中引用资源文件的形式一般都是@XXX/资源文件名,例如我们引用string.xml文件中的资源文件,我们可以使用@string/app_name来得到string.xml文件中的id名为app_name的属性值。一般做国际化(i18n)处理的时候,所有xml中的文字信息以及颜色信息等等等等都需要在xml中进行引用。

项目是如何运行起来的?

上面我们已经分析了这个项目工程的结构图,接下来我们便来分析一下HelloWorld项目是如何运行起来的。首先我们可以打开项目的清单文件,也就是AndroidManifest.xml文件,在这个文件中,我们可以轻易看到这样的几行代码:

这段代码表示对MainActivity这个活动进行注册,没有在AndroidManifest.xml文件中注册的活动(Activity在android中简称活动)是无法在手机的界面上显示出来的,也就是不能使用的。其中intent-filter叫做意图过滤器,这里面的两行代码非常重要:


这两行代码表明MainActivity是这个项目的第一启动活动,也就是这个项目的主活动,在手机桌面上点击应用图标,最先启动的就是这个活动。

接下来我们说说MainActivity中的内容

首先我们可以看到MainActivity是继承与AppCompatActivity的,AppCompatActivity是v7包提供的一个Activity基类,当然我们也可以继承android.app.Activity这个类。我们所有的活动都必须继承Activity基类才能表现出活动应有的特性。接下来我们看下onCreate()方法。onCreate()方法是一个活动被创建时必定要执行的方法, 其中只有两行代码, 并且没有Hello world!的字样,那么这个HelloWorld到底是从哪里来的。其实Android程序的设计讲究逻辑和视图分离, 因此是不推荐在活动中直接编写界面的,
更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。你可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个activity_main布局,那 Hello world!一定就是在这里定义的了!我们跟进去看一下,一切大白于心!

这不正是我们上面说的资源引用么?它引用了string.xml文件中的id为app_name的属性值,我们同样可以在去string.xml文件中看看,哦!原来helloworld是在这里定义的!是不是有一种柳暗花明又一村的感觉。原来是这么一回事啊。

接下来我们将资源文件的引用指向string.xml文件中的app_name2的属性值,我们可以看到手机屏幕上的helloworld此时已经变成了“中国新歌声”了。

总结

到这里,Helloworld入门项目的流程就已经讲解完毕了,当然还有很多具体的过程是我没有说到的,这里就需要小伙伴们自己去领悟与理解了,下一节我们讲解一下常用adb指令以及Androidstudio的一些常用配置,敬请期待!

0 0
原创粉丝点击