01-创建并运行第一个android项目

719 阅读6分钟

相关代码地址

使用的工具

现在android项目使用的 android studio 来进行开发,开发的语言现在推荐的是 kotlin, 不过这里还是先使用 Java 来开发

使用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!

启动项目查看结果

  1. 在 device manager 中找到对应的模拟器(这个是需要先下载的),在文章开头已经有给出参考的博文去进行安装和下载,然后启动对应的模拟器
  2. 在第二步中是选择对应的 android 项目模块
  3. 第三步中是启动项目,我这里是已经启动了,所以是重启的图标 启动项目之后,可以在模拟器中看到我们的项目已经安装了,如下所示 点击我们的应用之后就是展示的内容就是 Hello World

项目启动过程总结

android 中是逻辑和视图分离

  • 所谓的逻辑现在可以认为就是 activity 里面的代码,在上面的例子中就是 MainActivity 类
  • 所谓的视图就是在页面看到的布局,在上面的例子中就是 res/layout 目录下的 activity_main.xml 文件中对应的内容 那么打开我们的应用后到应用显示内容的整体过程是怎么样的呢?
  1. 在 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>
  1. 当打开我们的应用的时候,android 系统就会创建主 activity,此时就会调用这个 activity 中的 onCreate 方法
  2. 在 onCreate 方法中进行了视图的关联,即在这个 activity 中绑定了需要展示的内容,所以我们才看到了 Hello World 这句话(这句话就是在视图文件 activity_main.xml 文件中的 TextView 标签的 android:text 属性来设置的)