使用的工具
现在android项目使用的 android studio 来进行开发,开发的语言现在推荐的是 kotlin, 不过这里还是先使用 Java 来开发
-
AndroidStudio 版本: Android Studio Iguana | 2023.2.1
-
项目语言: Java
-
JDK版本: 17
下载 Android Studio 和应用工具 - Android 开发者 | Android Developers (google.cn)
对于 Android studio 的安装以及模拟器的创建可以参考 2023最新最全【Android Studio 】下载及安装和【Gradle配置】零基础入门到精通-CSDN博客
使用AndroidStudio创建项目
项目创建出来之后,整体的项目结构如下所示
需要注意的是这个项目结构在 Android Studio 是使用 project 视图展示的,而不是 android 视图展示的,这里整体分成两个部分,一个就是我们的项目目录,另外一个是和 gradle 编译相关的内容,接下来先看看 gradle 编译相关的内容
gradle编译相关
- build.gradle 是项目全局的构建脚本,目前来说这个文件现在不需要修改
- gradle.properties 是全局的 gradle 配置文件,在这里的配置是会影响到项目所有的编译配置,暂时不需要修改
- local.properties 是指定 android sdk 中的位置,还可以配置签名相关信息
- settings.gradle 用于指定项目中所有引入的模块,这里也可以配置仓库地址
依赖拉取慢的问题
如果都是使用项目默认的配置,那么 gradle 依赖拉取是很慢的,所以可以在 settings.gradle 中添加阿里云的仓库地址,修改后 settings.gradle 文件中的内容如下所示,主要添加的就是四个 maven 配置
pluginManagement {
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
} mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
mavenCentral()
google()
}
}
rootProject.name = "ADemo"
include ':app'
如何使用本地的 gradle
如上图所示,默认情况下即使我们本地没有安装 gradle,创建 gradle 项目之后是会自动去下载 gradle 的,对应的版本是在 gradle/wrapper/gradle-wrapper.properties 文件中可以查看,如果想要使用本地的 gradle,则可以按照下图配置
项目文件结构
- drawable: 该目录用来存放图片资源
- layout: 该目录用来存放布局文件
- mipmap: 该目录用来存放图标文件,至于上图中存放很多对应后缀的文件夹是为了做适配使用的,即可以做到不同的设备可以自动获取到不同目录下的资源
- values: 字符串值 上面只是简单介绍,比如 mipmap 中那么多后缀文件夹是怎么来的,后缀应该怎么写这里没有介绍,可以参考官方文档 应用资源概览 | Android 开发者 | Android Developers (google.cn)
项目启动流程
对于熟悉 Java 的人来说,项目运行的起点就是 Main 方法,但是在 android 中不是这样的,android 中没有 Main 方法这么一说,所有可见的界面都是 Activity(活动),什么是 Activity 可以参考 [[02-Android中四大组件]] ,而且所有的 Activity 都需要在 AndroidManifest.xml 进行注册,所以先看看 AndroidManifest.xml
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ADemo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
对于 AndroidManifest.xml 文件可以包含哪些标签,可以参考 [[AndroidManifest.xml文件详解]] , 在这个文件中有一个 Activity 标签,并且在这个标签里面还包含
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
表示当打开这个软件的时候启动的就是这个 activity,而在 activity 标签中有 android:name 属性值是 .MainActivity, 这里不是使用的全限定类名,开头是点,说明这里省略了主包名 com.example.ademo(这个包名是创建项目的时候就给定的),所以完整的 activity 路径是 com.example.ademo.MainActivity
package com.example.ademo;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
- MainActivity 继承了 AppCompatActivity,而 AppCompatActivity 是 androidx 包里面的内容,即这是 sdk 里面的内容,所以我们编写的 MainActivity 是被 android 系统调用的 ,而不是我们自己通过 main 方法来调用的,这里面我们只需要重写 Activity 中一些核心的方法即可,在这个例子中是重写了 onCreate 方法,至于 onCreate 方法是在什么时候被调用的 ,可以参考 [[Activity组件的生命周期]]
- 在重写的 onCreate 方法里面有两行重要的代码, super.onCreate(savedInstanceState) 和 setContentView(R.layout.activity_main), 其中 super.onCreate(savedInstanceState) 是我们自定义的 Activity 重写 onCreate 方法时必须要调用的,而 setContentView(R.layout.activity_main); 则是给当前 Activity 绑定对应的布局资源文件,这里是使用 R.layout.activiti_main 来表示 res/layout 目录下的 activity_main.xml 文件,至于为什么可以这样表示可以参考 [[Android中资源文件的表示形式]]
activity_main.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
这个比较重要的一点就是里面有一个 TextView 标签,这个在 android 中的名称是控件,控件的属性和控件的类型可以参考 [[Android中的布局元素]], 这里简单介绍一下
- TextView 是一个文本显示的控件,即将文件显示在界面中
- android:text 属性就是我们要显示的文本内容,所以这里显示的就是 Hello World!
启动项目查看结果
- 在 device manager 中找到对应的模拟器(这个是需要先下载的),在文章开头已经有给出参考的博文去进行安装和下载,然后启动对应的模拟器
- 在第二步中是选择对应的 android 项目模块
- 第三步中是启动项目,我这里是已经启动了,所以是重启的图标
启动项目之后,可以在模拟器中看到我们的项目已经安装了,如下所示
点击我们的应用之后就是展示的内容就是 Hello World
项目启动过程总结
android 中是逻辑和视图分离
- 所谓的逻辑现在可以认为就是 activity 里面的代码,在上面的例子中就是 MainActivity 类
- 所谓的视图就是在页面看到的布局,在上面的例子中就是 res/layout 目录下的 activity_main.xml 文件中对应的内容 那么打开我们的应用后到应用显示内容的整体过程是怎么样的呢?
- 在 AndroidManifest.xml 文件中找主 activity,也就是对应 activity 标签下的 intent-filter 标签中包含以下两个内容的 activity 就是主 activity, 对于 intent-filter 是什么,可以参考[[04-Android中的Intent]]
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
// 在 intent-filter 中包含以下内容的就是主 activity
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- 当打开我们的应用的时候,android 系统就会创建主 activity,此时就会调用这个 activity 中的 onCreate 方法
- 在 onCreate 方法中进行了视图的关联,即在这个 activity 中绑定了需要展示的内容,所以我们才看到了 Hello World 这句话(这句话就是在视图文件 activity_main.xml 文件中的 TextView 标签的 android:text 属性来设置的)