1. 从零开始你的第一个Android开发环境嘿朋友是不是看着手机里五花八门的App心里也痒痒地想自己动手做一个别觉得Android开发是座高不可攀的大山其实只要迈出第一步你会发现路就在脚下。今天我就带你从最最基础的环境搭建开始手把手教你配置好一切直到写出第一个能跳转页面的App。整个过程就像搭积木一样我们一块一块来。你可能听说过Android Studio、JDK、SDK这些名词感觉有点晕。别急我给你打个比方。你想做一顿大餐开发App首先得有个功能齐全的厨房Android Studio然后得有趁手的厨具和调料JDK和SDK。我们今天要做的就是帮你把这个“厨房”搭建起来并且确保“水电气”全通。我当年自己摸索的时候可没少在环境配置上踩坑不是这里路径不对就是那里版本冲突折腾得够呛。所以我会把每一步的细节和可能遇到的“坑”都告诉你让你一次成功少走弯路。那么我们需要准备什么呢主要就是三样东西Android Studio官方集成开发环境我们写代码的地方、JDKJava开发工具包因为Android开发主要用Java或Kotlin语言、Android SDKAndroid软件开发工具包里面包含了各种系统版本的代码库和工具。听起来很多但跟着步骤走其实很简单。我会告诉你从哪里下载怎么安装遇到问题怎么解决。咱们的目标很明确今天结束之前你能在电脑上跑起来一个最简单的Android应用并且能看到它从第一个页面跳转到第二个页面。准备好了吗我们开始吧。1.1 安装Android Studio打造你的开发主战场首先我们来安装最核心的工具——Android Studio。你可以把它想象成我们未来写代码、设计界面、调试程序的“总指挥部”。我强烈建议你从官方网站下载地址是developer.android.com/studio。为什么要用官网因为安全、稳定而且能保证是最新版本。有些第三方下载站可能会捆绑一些你不想要的软件或者版本老旧咱们从一开始就避开这些麻烦。下载完成后你会得到一个安装包。在Windows上是一个.exe文件在macOS上是一个.dmg文件。双击运行它安装过程基本就是一路“Next”。不过有几个关键步骤我得提醒你注意。在安装向导中它会让你选择安装组件。对于初学者我建议全部勾选特别是“Android Virtual Device”安卓虚拟设备也就是模拟器这个选项。有了它你即使没有真机手机也能在电脑上运行和测试你的App非常方便。安装路径你可以用默认的也可以自己指定一个容易找到的文件夹比如D:\Android\AndroidStudio这样以后管理起来清晰。安装过程可能会花点时间因为它会下载一些必要的组件。喝杯咖啡耐心等待一下。安装完成后首次启动Android Studio时它会让你选择是否导入之前的设置。如果你是第一次安装直接选择“Do not import settings”就行。接着它会进入一个设置向导让你选择安装类型。这里我们选“Standard”标准让工具帮我们进行默认配置这是最省心也是最推荐给新手的做法。向导会帮你下载最新的Android SDK组件这又是需要一点下载时间的步骤。全部完成后你就会看到Android Studio清爽的欢迎界面了这意味着你的“主战场”已经搭建完毕1.2 配置JDK与SDK确保“原料”供应畅通厨房有了接下来我们要确保“厨具”和“基础调料”到位这就是JDK和Android SDK。好消息是如果你按照上一节的“Standard”方式安装Android Studio它通常已经为你捆绑了一个合适的JDK通常是OpenJDK并安装了最新的Android SDK。但我们还是需要知道它们在哪以及如何确认一切正常。首先说JDK。Android Studio对JDK版本有要求不过它自带的通常是最兼容的。我们可以在Android Studio内部进行查看和配置。打开Android Studio在欢迎界面点击“More Actions”或者在任何项目界面点击“File” - “Project Structure”。在弹窗中你能看到“SDK Location”选项。这里会显示你JDK的安装路径。只要这里不是空的就说明JDK已经就位。我个人的经验是尽量使用Android Studio自带的JDK这样可以最大程度避免因为JDK版本不兼容导致的各种诡异问题比如Gradle同步失败、编译报错等。然后是Android SDK这是开发Android应用的核心“原料库”。同样在“Project Structure”的“SDK Location”里你会看到Android SDK的路径。更重要的是我们需要安装特定版本的SDK平台和工具。点击欢迎界面右下角的“Configure” - “SDK Manager”或者从工具栏的图标进入SDK管理器。这里你会看到两个主要标签“SDK Platforms”和“SDK Tools”。在“SDK Platforms”里你需要勾选至少一个Android版本进行安装。对于新手我建议安装一个相对较新但又比较稳定的版本比如Android 13 (API 33)或者Android 12 (API 31)。同时记得勾选这个版本下的“Google APIs”镜像这对于以后使用谷歌地图等服务有帮助。切换到“SDK Tools”标签这里有一些关键工具需要确保安装。首先“Android SDK Build-Tools”必须安装建议勾选最新的稳定版本。其次“Android Emulator”如果你要用模拟器就必须装。“Android SDK Platform-Tools”包含adb等调试工具也必须安装。“Intel x86 Emulator Accelerator (HAXM installer)”或“Android Emulator Hypervisor Driver”能大幅提升模拟器运行速度如果你的CPU支持强烈建议安装。勾选好后点击“Apply”Android Studio就会开始下载和安装这些组件。这个过程视网速而定可能需要较长时间。完成后你的开发环境所需的“原料”就全部备齐了。2. 创建第一个项目Hello World与模拟器运行环境配好了手是不是有点痒了咱们立刻来创建第一个项目看看我们的劳动成果。打开Android Studio在欢迎界面点击“New Project”。这里会提供一个项目模板列表对于纯新手我强烈推荐选择“Empty Views Activity”。这个模板最干净只包含一个最基本的界面和最简单的结构非常适合我们理解原理不会被多余的文件干扰。接下来我们需要配置项目的一些基本信息。Name是你的应用名称比如“MyFirstApp”。Package name是包名这是应用的唯一标识通常采用“com.公司名.应用名”的格式你可以先按默认的来。Save location选择你想存放项目的文件夹。Language这里我建议你选择Java。虽然Kotlin现在是谷歌更推荐的语言但Java的资料更庞大语法对于有其他语言基础的朋友也更熟悉入门阶段用Java能让你更专注于Android框架本身而不是新语言的语法。Minimum SDK是应用支持的最低系统版本这里我们选择刚才下载的SDK平台版本比如“API 33: Android 13”。选太低会无法使用新特性选太高会限制用户范围选择一个有足够市场份额的版本即可Android Studio会给出分布提示。最后点击“Finish”。项目创建后Android Studio会开始用Gradle构建项目。第一次构建会下载很多依赖库需要耐心等待。如果卡住了或者失败了最常见的原因是网络问题导致依赖下载超时。你可以尝试检查网络或者配置国内镜像源比如阿里云的Maven仓库这个我们后面如果遇到再详细说。构建成功后你就看到了Android Studio的主界面。2.1 认识项目结构找到你的代码和界面文件项目创建好了左边这一堆文件夹是不是看得眼花别慌我们只需要关注几个最核心的。这就是Android项目的标准结构了解它们各自的作用以后找东西就方便了。首先看app这个模块我们绝大部分工作都在这里面。展开app-src-main你会看到三个重要的子目录java目录这里存放所有的Java源代码。你刚创建的项目里应该已经有一个MainActivity.java文件了。Activity你可以暂时理解为一个“界面”或“屏幕”MainActivity就是应用启动时看到的第一个界面。我们待会儿写跳转逻辑主要就是在这里动刀。res目录这是资源目录所有非代码的东西都放在这里。它下面又有几个关键子文件夹layout存放界面布局文件是XML格式的。你会看到一个activity_main.xml它定义了MainActivity那个界面长什么样比如按钮在哪文字是什么。drawable存放图片、形状定义等可绘制资源。mipmap专门存放应用图标不同分辨率有不同文件夹。values存放字符串、颜色、样式等常量定义。比如你把所有界面文字都定义在strings.xml里方便统一管理和多语言适配。AndroidManifest.xml文件在main目录下和java、res平级。这个文件是应用的“身份证”和“总说明书”它声明了应用有哪些组件比如Activity哪个是启动入口需要哪些权限等等。我们创建新的Activity后必须在这里“注册”一下系统才知道它的存在。刚开始你只要记住界面样子改layout里的XML界面行为逻辑改java里的Java文件新加一个界面要在AndroidManifest.xml里注册。抓住这三点你就掌握了Android项目结构的精髓。2.2 运行到模拟器在虚拟手机上看到你的应用代码有了我们得让它跑起来看看效果。这就需要用到模拟器Android Virtual Device, AVD。点击工具栏那个手机形状、旁边有个小三角的图标AVD Manager或者从“Tools” - “Device Manager”进入。在设备管理器中点击“Create device”。首先选择设备型号新手我推荐选Pixel 5或者Pixel 6这是谷歌的亲儿子系列兼容性最好。然后选择系统镜像也就是Android版本。这里要选一个你已经下载好的版本就是我们之前在SDK Manager里安装的比如“API 33”。点击“Next”直到完成。创建好后在设备管理器列表里选中这个模拟器点击右边的播放按钮三角图标启动它。第一次启动模拟器就像开机一台新手机会慢一些请耐心等待。模拟器启动成功后回到Android Studio确保顶部工具栏的“运行目标”已经选中了你刚启动的模拟器比如Pixel_6_API_33。然后点击旁边绿色的运行按钮锤子图标右边那个或者直接用快捷键ShiftF10Windows/Linux或ControlRmacOS。Gradle会再次编译你的项目然后把应用安装到模拟器上并自动启动。如果一切顺利你将在模拟器屏幕上看到一个简单的界面上面显示着“Hello World”之类的文字。恭喜你你的第一个Android应用已经成功运行了这虽然简单但意味着你的整个开发环境链条是完全打通了的这是非常重要的一步。3. 理解Activity与Intent应用跳转的核心机制好了现在我们的应用能跑了但它只会傻傻地显示一个界面。一个真正的App怎么可能只有一个页面呢从微信的聊天列表跳到聊天窗口从淘宝的商品列表跳到商品详情这背后的魔法就是靠Activity和Intent这两个核心组件来实现的。这一节我们就把它们彻底搞明白。首先说Activity。你可以把它直观地理解成手机屏幕上的一个“界面”或“窗口”。一个Activity通常负责管理一个用户能与之交互的全屏界面。比如一个通讯录应用可能有一个“联系人列表Activity”和一个“联系人详情Activity”。我们之前创建的MainActivity就是应用启动后的第一个界面。每个Activity都是独立的它们共同组成了你的应用。那它们之间怎么通信、怎么跳转呢这就需要Intent出场了。Intent中文叫“意图”它就像一个信使或者一张“传票”。当你想从一个Activity跳到另一个Activity时你就创建一个Intent明确告诉系统“我当前Activity想去某某Activity目标Activity”。然后你把这个Intent交给系统调用startActivity()方法系统就会帮你完成跳转。Intent分为两种显式Intent和隐式Intent。对于新手我们先用好显式Intent它非常直白就是明确指定要启动哪个具体的Activity类比如从MainActivity跳到SecondActivity。隐式Intent则是指定一个动作比如“查看网页”、“分享图片”由系统匹配合适的应用或Activity来处理这个我们以后进阶再学。3.1 创建第二个Activity为跳转准备目标现在我们来实战一下。目标是从MainActivity跳转到一个新的页面。首先我们得创建这个新的页面也就是第二个Activity。在Android Studio里创建Activity非常方便。在java目录下找到你的包名比如com.example.myfirstapp右键点击它选择 “New” - “Activity” - “Empty Views Activity”。在弹窗中给这个新的Activity起个名字比如SecondActivity。注意观察下面的“Launcher Activity”复选框不要勾选这个勾选表示将它设为应用启动时的第一个界面我们已经有MainActivity了。其他设置保持默认点击“Finish”。神奇的事情发生了Android Studio不仅自动生成了SecondActivity.java这个Java源文件还在res/layout目录下生成了对应的界面布局文件activity_second.xml。更重要的是它自动在AndroidManifest.xml文件里为我们注册了这个新的Activity。你打开AndroidManifest.xml看看会发现里面多了一行activity android:name.SecondActivity ... /。这就是注册没有这行声明系统是找不到这个Activity的跳转就会失败。这一步自动化操作帮我们避免了一个新手常犯的错误。接下来我们可以简单装饰一下第二个界面。打开activity_second.xml文件你会看到默认也是一个TextView写着“Hello World!”。我们可以把它改成“欢迎来到第二个页面”或者加个按钮写上“返回首页”。修改布局文件和修改activity_main.xml一样都是在设计视图里拖拽控件或者在代码视图里改XML文本。这里我们先保持简单只改一下文字重点是实现跳转逻辑。3.2 编写跳转代码让按钮点击触发页面切换目标Activity准备好了现在我们要在起点MainActivity里设置一个“触发器”通常是点击一个按钮来发起跳转。首先打开activity_main.xml布局文件我们需要在“Hello World!”的TextView下面加一个按钮。你可以切换到“Design”视图从左侧的“Palette”里拖一个“Button”控件到屏幕上。或者切换到“Code”视图在XML代码里在TextView标签后面加上类似下面的代码Button android:idid/btn_jump android:layout_widthwrap_content android:layout_heightwrap_content android:text跳转到第二页 app:layout_constraintTop_toBottomOfid/textView !-- 假设你的TextView的id是textView -- app:layout_constraintStart_toStartOfparent app:layout_constraintEnd_toEndOfparent/注意android:idid/btn_jump这一行我们给按钮起了一个ID叫btn_jump这样在Java代码里才能找到它。保存布局文件后打开MainActivity.java。跳转逻辑我们一般写在onCreate方法里。我们需要做三件事找到这个按钮通过ID获取到我们在布局文件中定义的按钮对象。给按钮设置点击监听器告诉程序当这个按钮被点击时应该执行什么操作。在监听器里创建并启动Intent这就是执行跳转的核心代码。具体代码如下我会把关键点写在注释里// MainActivity.java package com.example.myfirstapp; // 你的包名可能不同 import android.content.Intent; // 1. 必须导入Intent类 import android.os.Bundle; import android.view.View; import android.widget.Button; // 导入Button类 import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 加载布局 // 2. 通过findViewById找到布局中的按钮R.id.btn_jump就是我们在XML里定义的id Button jumpButton findViewById(R.id.btn_jump); // 3. 给按钮设置点击监听器 jumpButton.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { // 4. 创建显式Intent参数1是当前Contextthis参数2是要跳转的目标Activity类 Intent intent new Intent(MainActivity.this, SecondActivity.class); // 5. 启动这个Intent完成跳转 startActivity(intent); } }); } }这段代码的逻辑非常清晰点击按钮 - 创建Intent指明从哪到哪 - 启动跳转。写完后再次点击运行按钮把你的应用安装到模拟器。你会看到第一个界面上多了一个“跳转到第二页”的按钮。大胆地点下去如果一切正确屏幕会平滑地切换到第二个界面显示“欢迎来到第二个页面”。这就是你实现的第一个交互功能感觉是不是很棒4. 深入Activity生命周期理解界面背后的状态流转实现了跳转你可能觉得已经大功告成了。但作为一个严谨的开发者我们还得知道这背后发生了什么。为什么跳转后原来的页面好像“暂停”了按返回键回来它又是怎么“恢复”的这就涉及到Activity生命周期这个至关重要的概念。理解生命周期你才能写出健壮的应用处理好诸如来电打断、屏幕旋转、内存不足等复杂场景。Activity的生命周期指的是一个Activity从创建到销毁所经历的一系列状态。Android系统通过回调Callback一系列方法来通知Activity当前处于哪个状态。你需要做的就是在合适的时机重写这些方法做合适的事情。主要的方法有七个我把它们和一个人的一天做个类比你就明白了onCreate(): 类比“出生”。Activity第一次被创建时调用。你必须在这里做初始化工作比如加载布局(setContentView)、绑定控件、初始化数据。只调用一次。onStart(): 类比“走到台前”。Activity变得可见但还不能交互。比如一个透明的Activity盖在上面。onResume(): 类比“开始表演”。Activity来到前台获得焦点用户可以与之交互了。这是应用最活跃的状态。onPause(): 类比“表演暂停”。当另一个Activity来到前台比如跳转、来电弹窗当前Activity会调用此方法。这里应该保存临时数据、释放占用资源如摄像头因为系统可能接下来会杀死你的Activity。操作要快不能耗时否则会影响新Activity的显示。onStop(): 类比“退到幕后”。Activity完全不可见时调用。如果内存紧张系统可能会在onStop()后直接销毁这个Activity。onDestroy(): 类比“生命结束”。Activity被销毁前调用。可能是用户按了返回键也可能是系统为回收内存而销毁它。这里是释放所有资源、进行最终清理的地方。onRestart(): 类比“重返舞台”。Activity从onStop()状态重新回到前台时调用之后会接着调用onStart()和onResume()。4.1 通过日志观察生命周期让状态变化“看得见”光说不练假把式。我们通过添加日志Log来亲眼看看跳转过程中两个Activity的生命周期是如何交替变化的。这在调试中是非常有用的技能。我们修改MainActivity.java和SecondActivity.java在它们的生命周期方法里加上日志输出。以MainActivity.java为例// MainActivity.java import android.util.Log; // 导入Log类 // ... 其他import public class MainActivity extends AppCompatActivity { // 定义一个TAG常量用于在Logcat中过滤日志 private static final String TAG MainActivity_Lifecycle; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, onCreate); // 使用Log.d()输出调试级别日志 // ... 你的按钮跳转代码 } Override protected void onStart() { super.onStart(); Log.d(TAG, onStart); } Override protected void onResume() { super.onResume(); Log.d(TAG, onResume); } Override protected void onPause() { super.onPause(); Log.d(TAG, onPause); } Override protected void onStop() { super.onStop(); Log.d(TAG, onStop); } Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, onDestroy); } Override protected void onRestart() { super.onRestart(); Log.d(TAG, onRestart); } }用同样的方法在SecondActivity.java中也重写这些方法记得把TAG常量改成SecondActivity_Lifecycle以便区分。现在运行应用并打开Android Studio底部的Logcat工具窗口。在Logcat的搜索框里你可以输入MainActivity_Lifecycle或SecondActivity_Lifecycle来过滤日志。然后进行以下操作并观察日志输出启动应用你会看到MainActivity依次打印onCreate-onStart-onResume。这说明它被创建、变得可见、并进入可交互状态。点击按钮跳转到SecondActivity你会看到MainActivity先打印onPause然后SecondActivity打印onCreate-onStart-onResume最后MainActivity打印onStop。这说明跳转时原Activity先暂停新Activity创建并启动然后原Activity完全不可见。按返回键从SecondActivity回到MainActivity你会看到SecondActivity打印onPause然后MainActivity打印onRestart-onStart-onResume最后SecondActivity打印onStop-onDestroy。这说明返回时原SecondActivity暂停之前的MainActivity重新启动并恢复然后原Activity被销毁。通过这个实验生命周期不再是抽象的概念而是变成了你可以清晰观察到的流程。这能帮你深刻理解为什么要把数据加载放在onCreate把资源释放放在onPause或onDestroy。4.2 处理常见的生命周期场景让应用更健壮理解了生命周期的回调顺序我们就能处理一些实际开发中常见的问题了。我举两个最典型的例子场景一屏幕旋转导致数据丢失你可能会发现当你在模拟器上旋转屏幕时快捷键CtrlF11或CtrlFnF11当前的Activity会经历销毁再重建的过程先onPause-onStop-onDestroy再onCreate-onStart-onResume。如果你在Activity里有一些临时输入的数据比如EditText里用户输入的文字旋转后就会消失。这是因为Activity被新建了旧的数据没了。怎么办这就需要用到onSaveInstanceState(Bundle outState)方法。系统会在Activity可能被销毁前调用这个方法给你一个Bundle对象像一个键值对背包让你保存临时数据。然后在onCreate或onRestoreInstanceState方法里你可以从这个Bundle里把数据取回来恢复界面。这是Android开发中的一个重要知识点。场景二跳转时保存状态在我们的跳转实验里从MainActivity跳走再返回MainActivity会走onRestart而不是onCreate这说明它没有被销毁只是停止了。因此它的界面状态比如按钮位置会被系统自动保存和恢复。但如果是更复杂的场景或者系统因为内存不足把后台的MainActivity销毁了那么返回时它就会重新onCreate。为了应对这种情况重要的、需要持久化的数据比如用户登录状态应该保存在更稳定的地方比如SharedPreferences、数据库或ViewModel中而不是仅仅依赖Activity的成员变量。把这些生命周期方法和实际场景联系起来思考你的代码就会变得更加可靠。刚开始可能觉得有点绕多写几次多观察几次Logcat自然而然就熟了。记住一个原则在onCreate里初始化在onResume里开始或恢复活跃操作如动画、传感器在onPause里暂停这些操作并保存轻量临时数据在onDestroy里进行最终清理。掌握了这个节奏你就能驾驭Activity的整个生命历程。