Android 开发项目教程:从零到一构建一个应用
本教程将分为以下几个部分:

- 准备工作:搭建开发环境
- Hello World - 你的第一个 Android 应用
- 待办事项 App - 核心功能实战
- 步骤 1:创建项目与界面布局
- 步骤 2:显示数据(使用
TextView和ListView) - 步骤 3:添加新任务(使用
EditText和Button) - 步骤 4:数据持久化(使用
Room数据库) - 步骤 5:删除任务与用户体验优化
- 进阶学习与资源推荐
- 总结与下一步
第一部分:准备工作:搭建开发环境
在开始编码之前,你需要准备好以下工具:
-
Java Development Kit (JDK): Android 应用主要使用 Java 或 Kotlin 编程,JDK 是运行它们的基础,推荐安装 JDK 11 或更高版本。
- 下载地址:Oracle JDK 或 OpenJDK
-
Android Studio: 这是 Google 官方推荐的 Android 集成开发环境,它包含了代码编辑器、调试器、模拟器以及各种强大的开发工具。
- 下载地址: Android Studio 官网
- 安装: 按照官网的指引进行安装,在安装过程中,确保勾选了 "Android Virtual Device" (AVD),以便创建模拟器。
-
Android SDK (Software Development Kit): Android Studio 会自动为你下载和管理最新的 Android SDK,这是开发 Android 应用所必需的软件开发工具包。
(图片来源网络,侵删) -
Android Virtual Device (AVD) 或真实设备:
- AVD (模拟器): 你可以在 Android Studio 中创建一个虚拟手机设备来运行和测试你的应用。
- 真实设备: 你也可以将你的 Android 手机通过 USB 连接到电脑,并开启“开发者选项”和“USB 调试”来直接在真机上测试。
第二部分:项目一:Hello World - 你的第一个 Android 应用
这个项目将带你熟悉 Android Studio 的基本界面和创建一个简单应用的流程。
步骤 1: 创建新项目
- 打开 Android Studio。
- 点击 "New Project" (新建项目)。
- 选择 "Empty Views Activity" (空视图活动),然后点击 "Next"。
- 配置项目:
- Name:
HelloWorld - Package name: 通常使用反向域名格式,如
com.example.helloworld,你可以保持默认。 - Save location: 选择项目保存的路径。
- Language: 选择 Kotlin (现代、简洁,Google 官方推荐) 或 Java。
- Minimum SDK: 选择一个较低的 API 级别(如 API 24: Android 7.0),以覆盖更多设备。
- Name:
- 点击 "Finish",Android Studio 会自动构建你的项目,这可能需要几分钟。
步骤 2: 理解项目结构
在项目窗口中,切换到 "Android" 视图,你会看到几个关键文件夹:
java/: 存放你的 Kotlin 或 Java 代码。com.example.helloworld: 你的包名。MainActivity.kt: 应用的主入口文件。
res/: 存放应用的资源文件(图片、布局、字符串等)。layout/: 存放 XML 文件,用于定义界面布局。activity_main.xml就是主界面的布局。mipmap-.../: 存放应用图标。values/: 存放字符串 (strings.xml)、颜色 (colors.xml) 等资源。
AndroidManifest.xml: 应用的清单文件,定义了应用的基本信息、组件、权限等。
步骤 3: 修改并运行应用
-
修改文本: 打开
res/values/strings.xml文件,找到Hello World!这一行,将其修改为你好,Android!。<resources> <string name="app_name">HelloWorld</string> <string name="hello_world">你好,Android!</string> <!-- 修改这里 --> </resources> -
运行应用: 点击工具栏上的绿色 "Run" 按钮 (▶),选择一个模拟器或已连接的真机,然后点击 OK。
几秒钟后,模拟器会启动,并显示你的应用,你会看到屏幕中央的文字已经变成了 "你好,Android!"。
恭喜!你已经成功创建了并运行了你的第一个 Android 应用!
第三部分:项目二:待办事项 App - 核心功能实战
这个项目将教你如何构建一个功能完整的应用,包括 UI、数据交互和本地数据存储。
步骤 1: 创建项目与界面布局
-
创建新项目: 像之前一样,创建一个新项目,选择 "Empty Views Activity",命名为
TodoApp,语言选择 Kotlin。 -
设计主界面 (
activity_main.xml): 我们需要一个输入框、一个添加按钮和一个显示任务列表的区域。打开
res/layout/activity_main.xml,切换到 "Split" 或 "Code" 视图,修改代码如下:<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" tools:context=".MainActivity"> <!-- 输入框 --> <EditText android:id="@+id/editTextTodo" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入新任务..." /> <!-- 添加按钮 --> <Button android:id="@+id/buttonAdd" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="添加" /> <!-- 任务列表 --> <ListView android:id="@+id/listViewTodos" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="16dp" /> </LinearLayout>LinearLayout: 一种线性布局,orientation="vertical"表示子元素垂直排列。EditText: 用于输入文本。Button: 用于触发操作。ListView: 用于垂直滚动地显示一个项目列表。
步骤 2: 显示数据(使用 TextView 和 ListView)
-
在
MainActivity.kt中添加变量: 在MainActivity类的onCreate方法之前,声明两个变量来引用布局中的控件。class MainActivity : AppCompatActivity() { private lateinit var editTextTodo: EditText private lateinit var buttonAdd: Button private lateinit var listViewTodos: ListView // ... onCreate ... } -
初始化控件并设置适配器: 在
onCreate方法中,使用findViewById找到这些控件,并为ListView设置一个简单的适配器来显示一些初始数据。override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化控件 editTextTodo = findViewById(R.id.editTextTodo) buttonAdd = findViewById(R.id.buttonAdd) listViewTodos = findViewById(R.id.listViewTodos) // 创建一个简单的数据列表 val todoList = mutableListOf("学习 Android 开发", "购买牛奶", "完成项目报告") // 创建一个适配器,用于将数据列表连接到 ListView // ArrayAdapter 是最简单的适配器,用于将数组或列表绑定到像 ListView 或 Spinner 这样的视图。 val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, todoList) // 为 ListView 设置适配器 listViewTodos.adapter = adapter }运行应用,你应该能看到一个包含三项任务的列表。
步骤 3: 添加新任务(使用 EditText 和 Button)
现在我们需要让“添加”按钮真正工作起来。
-
为按钮添加点击事件: 在
onCreate方法中,为buttonAdd设置一个OnClickListener。override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // ... (之前的初始化代码) ... val todoList = mutableListOf("学习 Android 开发", "购买牛奶", "完成项目报告") val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, todoList) listViewTodos.adapter = adapter // 为按钮添加点击事件 buttonAdd.setOnClickListener { // 1. 获取输入框中的文本 val newTodo = editTextTodo.text.toString() // 2. 检查输入是否为空 if (newTodo.isNotEmpty()) { // 3. 将新任务添加到数据列表 todoList.add(newTodo) // 4. 通知适配器数据已改变,以便刷新 ListView adapter.notifyDataSetChanged() // 5. 清空输入框 editTextTodo.text.clear() } } }运行应用,现在你可以在输入框中输入内容,点击“添加”按钮,新任务就会出现在列表下方。
步骤 4: 数据持久化(使用 Room 数据库)
当应用关闭后,任务列表就会丢失,我们需要将数据保存到本地数据库中,Google 推荐使用 Room 数据库。
-
添加依赖: 打开
app/build.gradle.kts(或app/build.gradle) 文件,在dependencies代码块中添加以下依赖:// Room implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") // Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:2.6.1")- 注意: 如果你使用的是 Groovy (
build.gradle),依赖语法会稍有不同。 - 添加完依赖后,点击 Android Studio 弹出的 "Sync Now" 同步项目。
- 注意: 如果你使用的是 Groovy (
-
创建实体类 (
Todo.kt): 这个类代表数据库中的一张表。- 在
java/com.example.todoapp包下,右键 -> New -> Kotlin Class/File,命名为Todo。 - 代码如下:
import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "todos") // 定义表名 data class Todo( @PrimaryKey(autoGenerate = true) val id: Int = 0, // 主键,自动生成 val text: String // 任务内容 ) - 在
-
创建数据访问对象 (
TodoDao.kt): Dao (Data Access Object) 是用于访问数据库的接口。- 新建一个 Kotlin 接口,命名为
TodoDao。 - 代码如下:
import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query @Dao interface TodoDao { @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insert(todo: Todo) @Query("SELECT * FROM todos ORDER BY id ASC") fun getAllTodos(): LiveData<List<Todo>> }suspend: 表示这是一个可以在协程中挂起执行的函数,不能在主线程直接调用。LiveData: 一个可观察的数据持有者,当数据库中的数据变化时,它会通知 UI 层进行更新。
- 新建一个 Kotlin 接口,命名为
-
创建数据库 (
AppDatabase.kt): 将实体和 DAO 组合起来。- 新建一个抽象类,命名为
AppDatabase。 - 代码如下:
import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @Database(entities = [Todo::class], version = 1, exportSchema = false) abstract class AppDatabase : RoomDatabase() { abstract fun todoDao(): TodoDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getDatabase(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "todo_database" ).build() INSTANCE = instance instance } } } } - 新建一个抽象类,命名为
-
修改
MainActivity以使用数据库: 这是最复杂的一步,我们需要将MutableList替换为LiveData,并使用协程来处理数据库操作。class MainActivity : AppCompatActivity() { // ... (控件声明) ... private lateinit var adapter: ArrayAdapter<String> // 注意:这里我们仍然用 ArrayAdapter 显示字符串 private lateinit var todoDao: TodoDao private val todoTexts = mutableListOf<String>() // 用于存储显示的文本 private var allTodos: LiveData<List<Todo>>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化控件 // ... // 初始化数据库 val database = AppDatabase.getDatabase(applicationContext) todoDao = database.todoDao() // 初始化适配器 adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, todoTexts) listViewTodos.adapter = adapter // 观察数据库变化 allTodos = todoDao.getAllTodos() allTodos?.observe(this) { todos -> // 当数据库数据变化时,这个 lambda 表达式会执行 todoTexts.clear() todos.forEach { todo -> todoTexts.add(todo.text) } adapter.notifyDataSetChanged() } // 按钮点击事件 buttonAdd.setOnClickListener { val newTodoText = editTextTodo.text.toString() if (newTodoText.isNotEmpty()) { // 在 IO 线程中执行数据库插入操作 CoroutineScope(Dispatchers.IO).launch { val newTodo = Todo(text = newTodoText) todoDao.insert(newTodo) } editTextTodo.text.clear() } } } }- 你需要在文件顶部添加必要的导入:
import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch
CoroutineScope(Dispatchers.IO).launch { ... }: 这确保了数据库操作在后台的 IO 线程执行,不会阻塞主线程,避免应用卡顿。
运行应用,现在添加的任务即使关闭应用再重新打开,也依然存在了!
- 你需要在文件顶部添加必要的导入:
步骤 5: 删除任务与用户体验优化
-
为
ListView添加长按删除功能: 在onCreate中,为listViewTodos添加一个OnItemLongClickListener。// 在 onCreate 中,设置完适配器后添加 listViewTodos.setOnItemLongClickListener { parent, view, position, id -> // 获取被点击的任务 val todoToDelete = allTodos?.value?.get(position) // 在 IO 线程中执行删除操作 if (todoToDelete != null) { CoroutineScope(Dispatchers.IO).launch { todoDao.delete(todoToDelete) // 你需要在 TodoDao 中添加 delete 方法 } } true // 表示事件已处理 }- 你需要在
TodoDao中添加delete方法:@Delete suspend fun delete(todo: Todo)
- 你需要在
-
优化 UI (可选): 你可以为任务列表项添加一个复选框,表示任务已完成,这需要创建一个自定义的布局文件 (
item_todo.xml) 并使用ArrayAdapter或更强大的RecyclerView来绑定数据。RecyclerView是现代 Android 开发中用于高效显示列表的标准组件,强烈建议学习。
第四部分:进阶学习与资源推荐
完成这个项目后,你已经掌握了 Android 开发的核心基础,接下来可以学习:
- RecyclerView: 用于构建更复杂、更高效的列表和网格布局。
- Navigation Component: 用于管理应用内的页面跳转,是处理导航的官方推荐方案。
- WorkManager: 用于调度那些即使应用退出或设备重启也需要保证执行的后台任务。
- 依赖注入: 使用 Hilt 或 Koin 来管理对象的生命周期,使代码更易于测试和维护。
- MVVM 架构模式: 将 UI、业务逻辑和数据分离,是大型项目的标准架构。
推荐资源:
- 官方文档: developer.android.com - 最权威、最准确的资料。
- Android Developers 官方 YouTube 频道: 提供了大量高质量的视频教程和会议录像。
- Android Codelabs: 互动式的编程教程,手把手教你实现特定功能。
- 书籍: 《Android 编程权威指南》(Big Nerd Ranch Guide)是一本非常经典的入门书籍。
- 社区: Stack Overflow, Reddit (r/androiddev), V2EX 等社区。
第五部分:总结与下一步
通过这两个项目,你已经:
- 掌握了环境搭建:学会了安装和配置 Android Studio。
- 理解了项目结构:知道了代码、资源和配置文件的位置和作用。
- 学会了 UI 开发:能够使用 XML 布局文件设计简单的界面。
- 掌握了事件处理:学会了为按钮和列表项添加点击事件。
- 学习了数据绑定:理解了 Adapter 的作用,能够将数据展示在 UI 上。
- 实践了数据持久化:掌握了使用 Room 数据库进行本地存储的基本方法。
- 了解了多线程:学会了使用协程来避免在主线程中执行耗时操作。
这是一个非常棒的开始!Android 开发是一个广阔的领域,充满了挑战和乐趣,保持好奇心,多动手实践,不断学习新的技术和最佳实践,你一定能成为一名出色的 Android 开发者,祝你编码愉快!
