Android入门笔记(AS 的项目结构)
Android 介绍Android 系统是目前占有率最高的移动操作系统,它大致可以分为四层架构:Linux 内核层:Android 系统是基于 Linux 内核,这层为 Android 设备的各种硬件提供底层驱动,如:显示驱动、音频驱动、蓝牙驱动等。系统运行库层:通过一些 C/C++ 库来为 Android 系统提供主要的特性支持。应用框架层:提供构建应用程序时可能用到的各种 API应...
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)