杰瑞科技汇

android开发项目教程

Android 开发项目教程:从零到一构建一个应用

本教程将分为以下几个部分:

android开发项目教程-图1
(图片来源网络,侵删)
  1. 准备工作:搭建开发环境
  2. Hello World - 你的第一个 Android 应用
  3. 待办事项 App - 核心功能实战
    • 步骤 1:创建项目与界面布局
    • 步骤 2:显示数据(使用 TextViewListView
    • 步骤 3:添加新任务(使用 EditTextButton
    • 步骤 4:数据持久化(使用 Room 数据库)
    • 步骤 5:删除任务与用户体验优化
  4. 进阶学习与资源推荐
  5. 总结与下一步

第一部分:准备工作:搭建开发环境

在开始编码之前,你需要准备好以下工具:

  1. Java Development Kit (JDK): Android 应用主要使用 Java 或 Kotlin 编程,JDK 是运行它们的基础,推荐安装 JDK 11 或更高版本。

  2. Android Studio: 这是 Google 官方推荐的 Android 集成开发环境,它包含了代码编辑器、调试器、模拟器以及各种强大的开发工具。

    • 下载地址: Android Studio 官网
    • 安装: 按照官网的指引进行安装,在安装过程中,确保勾选了 "Android Virtual Device" (AVD),以便创建模拟器。
  3. Android SDK (Software Development Kit): Android Studio 会自动为你下载和管理最新的 Android SDK,这是开发 Android 应用所必需的软件开发工具包。

    android开发项目教程-图2
    (图片来源网络,侵删)
  4. Android Virtual Device (AVD) 或真实设备:

    • AVD (模拟器): 你可以在 Android Studio 中创建一个虚拟手机设备来运行和测试你的应用。
    • 真实设备: 你也可以将你的 Android 手机通过 USB 连接到电脑,并开启“开发者选项”和“USB 调试”来直接在真机上测试。

第二部分:项目一:Hello World - 你的第一个 Android 应用

这个项目将带你熟悉 Android Studio 的基本界面和创建一个简单应用的流程。

步骤 1: 创建新项目

  1. 打开 Android Studio。
  2. 点击 "New Project" (新建项目)。
  3. 选择 "Empty Views Activity" (空视图活动),然后点击 "Next"。
  4. 配置项目:
    • Name: HelloWorld
    • Package name: 通常使用反向域名格式,如 com.example.helloworld,你可以保持默认。
    • Save location: 选择项目保存的路径。
    • Language: 选择 Kotlin (现代、简洁,Google 官方推荐) 或 Java。
    • Minimum SDK: 选择一个较低的 API 级别(如 API 24: Android 7.0),以覆盖更多设备。
  5. 点击 "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: 修改并运行应用

  1. 修改文本: 打开 res/values/strings.xml 文件,找到 Hello World! 这一行,将其修改为 你好,Android!

    <resources>
        <string name="app_name">HelloWorld</string>
        <string name="hello_world">你好,Android!</string> <!-- 修改这里 -->
    </resources>
  2. 运行应用: 点击工具栏上的绿色 "Run" 按钮 (▶),选择一个模拟器或已连接的真机,然后点击 OK。

几秒钟后,模拟器会启动,并显示你的应用,你会看到屏幕中央的文字已经变成了 "你好,Android!"。

恭喜!你已经成功创建了并运行了你的第一个 Android 应用!


第三部分:项目二:待办事项 App - 核心功能实战

这个项目将教你如何构建一个功能完整的应用,包括 UI、数据交互和本地数据存储。

步骤 1: 创建项目与界面布局

  1. 创建新项目: 像之前一样,创建一个新项目,选择 "Empty Views Activity",命名为 TodoApp,语言选择 Kotlin

  2. 设计主界面 (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: 显示数据(使用 TextViewListView

  1. MainActivity.kt 中添加变量: 在 MainActivity 类的 onCreate 方法之前,声明两个变量来引用布局中的控件。

    class MainActivity : AppCompatActivity() {
        private lateinit var editTextTodo: EditText
        private lateinit var buttonAdd: Button
        private lateinit var listViewTodos: ListView
        // ... onCreate ...
    }
  2. 初始化控件并设置适配器: 在 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: 添加新任务(使用 EditTextButton

现在我们需要让“添加”按钮真正工作起来。

  1. 为按钮添加点击事件: 在 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 数据库。

  1. 添加依赖: 打开 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" 同步项目。
  2. 创建实体类 (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 // 任务内容
    )
  3. 创建数据访问对象 (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 层进行更新。
  4. 创建数据库 (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
                }
            }
        }
    }
  5. 修改 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: 删除任务与用户体验优化

  1. 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)
  2. 优化 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 开发者,祝你编码愉快!

分享:
扫描分享到社交APP
上一篇
下一篇