Android入门笔记(AS 的项目结构)
Android 介绍
Android 系统是目前占有率最高的移动操作系统,它大致可以分为四层架构:
- Linux 内核层:Android 系统是基于 Linux 内核,这层为 Android 设备的各种硬件提供底层驱动,如:显示驱动、音频驱动、蓝牙驱动等。
- 系统运行库层:通过一些
C/C++库来为 Android 系统提供主要的特性支持。 - 应用框架层:提供构建应用程序时可能用到的各种 API
- 应用层:所有安装在手机上的应用程序都是属于这一层。比如系统自带的联系人、短信等程序。
Android 系统有四大组件,分别是:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。
- 活动
Activity:可以理解为所有应用程序的门面,凡是在应用中看到的东西都放置在活动中 - 服务
Service:与 活动 不同,服务是在后台运行的,即使用户退出应用,服务也可以继续运行 - 广播接收器
Broadcast Receiver:广播接收器允许应用接收来自各处的广播消息,比如电话、短信等 - 内容提供器
Content Provider:为应用之间共享数据提供了可能
1 Android Studio 初始化项目的项目结构
开发 Android 最好就是使用 Android Studio IDE,Android Studio 初始化项目的目录结构如下:
.gradle和.idea:这两个目录复制都是 AS 自动生成的一些文件app:项目中的代码、资源等内容几乎都是放置在该目录下build:主要是一些编译时自动生成的文件gradle:这个目录下包含 gradle wrapper 的配置文件gradle-wrapper.properties,它包含 gradle 的版本号,使用 gradle wrapper 的方式导入项目不需要提前将 gradle 下载好,而是会自动根据本地缓存情况决定是否下载 gradle,是否使用 gradle wrapper 方式可以在 AS 导航栏中的Settings设置。build.gradle:这是项目全局的 gradle 构建脚本,通常不用修改。使用多模块的时候,可以在这里定义引用库的版本号,给内部的 gradle 构建脚本使用gradle.properties:这是 gradle 的全局配置文件MyAndroidApp.iml:iml文件是所有 IDEA 项目都会自动生成的一个文件,而 AS 是基于 IDEA 开发的。local.properties:这个文件用于指定本机中的 Android SDK 路径,是软件自动生成settings.gradle:该文件用于指定项目中所有引入的模块
1.1 app 目录的结构
上面已经介绍过 app 目录才是项目的重点,它的目录结构是:
build:与外层的build目录类似,主要是一些编译时自动生成的文件,无需关心libs:项目中使用的第三方 jar 包,就需要把这些 jar 包放置在libs目录下,放置在这个目录下的 jar 包都会自动添加到构建路径中androidTest:自动化测试java:放置 java 代码的地方res:项目中使用到的所有图片、布局、字符串等资源都要放置在该目录下,比如:drawable:放置图片文件mipmap:放置应用图标layout:放置布局文件values:放置字符串、样式、颜色等配置
AndroidMainfest.xml:该文件是整个项目的配置文件,在程序中定义的所有四大组件都需要在这个文件中进行注册,还可以给应用程序添加权限声明test:自动化测试.gitignore:值得注意的是app模块的外层也有.gitignore文件app.iml:IDEA 项目自动生成的文件build.gradle:app模块即当前模块的 gradle 构建脚本proguard-rules.pro:用于指定项目代码的混淆规则,当代码开发完成后打包成安装包文件,如果不希望代码被人破解,就需要将代码进行混淆,让破解者难以阅读
1.1.1 详解 build.gradle 文件
AS 是采用 gradle 来构建项目的,gradle 是一个项目构建工具,它使用一种基于 Groovy 的领域特定语言来声明项目设置。
在前面已经说过,一个刚刚初始化的项目中有两个 build.gradle 文件,一个是在外层,一个是在 app 目录下的。
刚初始化的最外层 build.gradle 文件,代码如下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
repositories闭包:表示仓库设置,jcenter 是一个代码托管仓库,很多 Android 开源项目都会选择将代码托管到 jcenter 上,声明了jcenter这行配置,就可以在项目中轻松应用任何 jcenter 上的开源项目,google同理- 使用
classpath声明一个 gradle 插件,gradle 除了构建 Android 项目还可以构建 Java、C++ 等多种项目,所以需要声明com.android.tools.build:gradle这个插件来告知 gradle 构建 Android 项目。
app 目录下的 build.gradle 文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "top.seiei.myandroidapp"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
- 代码的第一行表示应用了一个插件,一般有两个值可选:
com.android.application:表示这是个 应用程序模块com.android.library:表示这是个 库模块,二者区别在于,前者是可以直接运行的,后者需要应用程序模块引用
android闭包:这个闭包设置了项目构建的各种属性:compileSdkVersion:指定项目的编译版本buildToolsVersion:指定项目构建工具的版本defaultConfig闭包:applicationId指定项目的包名(想要修改包名,即可在这里修改)minSdkVersion指定项目最低兼容的 Android 系统版本targetSdkVersion指定的值表示你再该目标版本上已经做过了充分的测试,系统会将为你的应用程序启用一些最新的功能和特性versionCode:指定项目的版本号,在生成安装文件时用到versionName:指定项目的版本名,在生成安装文件时用到
buildTypes闭包:指定生成安装文件的相关配置release闭包:指定正式版安装文件的配置,其中minifyEnabled表示是否对项目的代码进行混淆,proguardFiles表示指定混淆时使用的规则文件debug闭包:指定测试版安装文件的配置,可以忽略
dependencies闭包:通常 AS 项目有三种依赖方式:本地依赖、库依赖和远程依赖。- 本地依赖可以对本地的 Jar 包或目录添加依赖关系。上面的
implementation fileTree就是一个本地依赖声明,它表示将libs目录下的所有.jar后缀的文件都添加到项目的构建路径中 - 库依赖可以对项目中的库模块添加依赖关系。它的基本格式是:
implementation project后面加上要依赖的库模块的名称,如一个库模块的名称叫helper,那么声明就为implementation project(':helper') - 远程依赖可以对如 jcenter 库上的开源项目添加依赖关系。上面的
implementation androidx.appcompat:appcompat:1.1.0就是一个远程依赖声明,其中androidx.appcompat是域名部分,appcompat是组名称,1.1.0是版本号。gradle 在构建项目的时候会先检查本地是否有该库的缓存,如果没有才会去联网下载
- 本地依赖可以对本地的 Jar 包或目录添加依赖关系。上面的
想要卸载 AS 虚拟机的apk,可以直接在命令行中输入如:
adb uninstall com.example.test的命令
1.1.2 Androidmanifest.xml 文件
1.1.2.1 android:theme
在默认的初始项目中,每个活动最顶部都会有一个标题栏 ActionBar,这是因为默认初始化的情况下,AndroidManifest.xml 文件会指定一个 android:theme 属性,这个属性通常指向 res/values/styles.xml 文件,代码如下表示:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
这里定义了一个名叫 AppTheme 的主题,指定了它的 parent 主题是 Theme.AppCompat.Light.DarkActionBar。这里可以指定 parent 主题为 Theme.AppCompat.NoActionBar 或 Theme.AppCompat.Light.NoActionBar,从而指定一个不带 ActionBar 的主题,前者表示将界面的主题颜色设置为深色,陪衬颜色为淡色,而后者反之。
而 item 标签表示的是重写的属性,除了以上属性,还可以通过以下属性来设置更多位置上的颜色:
其中 colorAccent 属性表达一个强调的意思,如一些控件被选中时就会显示这个颜色。
1.1.2.2 android:name
很多操作都是在活动中进行的,而活动本身就是一个 Context,所以一般不用愁。但当程序复杂起来,很多的逻辑代码都会脱离 Activity 类,而又需要用到 Context,比如说 Toast 方法,那么如何定义一个全局的 Context 以供获取呢?
Android 提供一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化,以便管理程序内一些全局的状态信息。
以下代码为自定义 Application 类:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
此时还需要告知系统,当程序启动的时候应该启动的是自定义的 Application 类而不是默认的,这只需要在 AndroidManifest.xml 文件中的 application 标签下指定 android:name 属性即可,如:
<application android:name="top.seiei.test.MyApplication">
...
</application>
这样就实现了一种全局获取 Context 的机制,此时不管在项目的任何地方使用 Context,只需调用以下 MyApplication.getContext() 方法即可。
更多推荐



所有评论(0)