一、Android应用目录结构简单介绍
在Android Studio上开发Android应用简单方便,除了创建Android项目,开发者只需做两件事情:1.使用activiy_main.xml文件定义用户界面;2.打开Java源代码编写业务实现。但对于一个想要了解细节的学习者来说,这种方式会让人迷惑:例如:findViewById(R.id.show);代码中的R.id.show是从哪里来的?又是什么?为什么setContentView(R.layout.activity_main);代码设置使用activity_main.xml文件定义的界面布局?等等诸如此类……
有句话叫“不想当将军的士兵不是好士兵”,类似的,也可以说,不想探究原理、机制的程序员不是好程序员。所以,在这个角度上来看,了解一下Android的应用结构还是有些必要的。
拿很简单的一个HelloWorld工程举例,在AndroidStudio下建好工程后,Android视图下可以看到如下目录:
在这些文件目录中,res、src、AndroidManifest.xml文件是Android项目必需的。其他目录、文件都是可选的。
libs目录:存储Android项目所需的第三方JAR包。
res目录:专用于存放Android项目的各种资源文件,比如layout存放界面布局文件,values目录下存放各种XML格式的资源文件,例如字符串资源文件:strings.xml;颜色资源文件colors.xml;尺寸资源文件,dimens.xml。
关于drawable和mipmap这两个文件夹的存放目标文件就会开始有所争议,在以前的使用Eclipse的年代,我们通常将图标、图片资源放在drawable文件夹下,但是在AS下将图片资源图标放在mipmap下也可以完美运行程序,但在Android官网上的说法:mipmap是用来存放启动图标的文件夹(原文:mipmap/For app launcher icons.),而PNG、JPEG、GIF、9-partch图、XML文件资源还是全部放在drawable里。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi这4个子目录则分别用于存放低分辨率、中分辨率、高分辨率、超高分辨率的4种图片文件。
src目录:存储Android项目开发中的各种源文件,包括各种Java源文件(放在main\java子目录下),各种资源文件(放在main\res子目录下)和AndroidMainifest.xml文件。除此之外还可以看到src目录下还包含一个androidTest子目录,该目录下存放的是Android测试项目。
AndroidManifest.xml文件是Android项目的系统清单文件,它用于控制Android应用的名称、图标、访问权限等整体属性。除此之外,Android程序中的四大组件都要在该文件中注册。
对于Android开发者而言,重点关注的就是两部分:
1、src目录下(对于Android Studio项目的 app\src\main\java子目录)的各种Java文件;
2、res目录下(对于Android Studio项目的app\src\main\res子目录)的各种资源文件。
所以,进行Android开发都是先编辑XML格式的界面布局文件,再编辑相应的Java文件。
二、Android应用的清单文件:AndroidManifest.xml
AndroidManifest.xml清单文件是每个Android项目所必需的,它是整个Android应用的全局描述文件。AndroidManifest.xml清单文件说明了该应用的名称、所使用的图标以及包含的组件等。
AndroidManifest.xml清单文件通常可以包含如下信息。
1、应用程序的包名,该包名讳作为该应用的唯一标识。
2、应用程序所包含的组件,如Activity、Service、BroadcastReceiver和ContentProvider等。
3、应用程序兼容的最低版本。
4、应用程序使用系统所需的权限说明。
5、其他程序访问该程序所需的权限声明。
下面是一份简单的AndroidManifest.xml清单文件:
<?xml version="1.0" encoding="utf-8"?>
<!--指定该Android应用的包名,该包名可用于唯一地标识该应用-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.z.helloworld"
android:versionCode="1"
android:versionName="1.0">
<!-- 指定Android应用标签、图标-->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 定义Android应用的一个组件:Activity,该Activity的类为HelloWorld,并指定该Activity的标签-->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<!-- 指定该Activity是程序的入口-->
<action android:name="android.intent.action.MAIN" />
<!-- 指定加载该应用时运行该Activity-->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
上述清单文件中有两处用到了资源:
android:label="@string/app_name",这说明该应用的标签(Label)为/res/value目录下strings.xml文件中名为app_name的字符串值。
android:icon="@mipmap/ic_launcher",这一行代码说明该应用的图标为/res/mipmap目录下主文件名为icon的图片。
三、应用程序权限说明
在AndroidManifest.xml清单文件中为<manifest.../>元素以内、<application.../>元素以外添加<uses-permission>子元素即可为此程序声明权限。
例如:
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 声明该应用需要调用拨打电话功能的权限-->
以下图为Android系统的常用权限: