Android移动应用开发入门:从实验报告到Activity与UI实战

发布时间:2026/10/19 2:25:22
Android移动应用开发入门:从实验报告到Activity与UI实战
简介这份实验报告面向软件学院修读移动应用软件开发技术课程的学生聚焦Android平台开发入门帮助读者完成从环境搭建到界面设计的完整实践训练。资源包内含1个doc文档约1.63MB以实验报告正文形式呈现涵盖实验目的、内容原理、操作要求与结果记录等模块便于直接参考撰写或对照自查。报告围绕三大实验展开Android系统环境搭建涉及JDK安装与环境变量配置、Eclipse解压使用、Android SDK在线更新与离线安装、ADT插件安装等关键环节Activity运用实验讲解Activity的创建、启动、生命周期管理及Intent跳转与数据传递Android应用UI设计覆盖TextView、Button、ImageView等基础控件以及LinearLayout、RelativeLayout、GridLayout等布局管理器和自定义View、XML布局文件设计。目前已有767人学习下载适合需要系统梳理Android开发流程、理解Activity机制与UI构建方法的学习者参考也可作为课程实验报告撰写的模板与排错思路来源。1. 从一份实验报告说起Android 移动应用开发到底怎么入门很多人第一次接触移动应用开发不是从公司项目开始的而是从一份实验报告开始的。这份《软件学院移动应用软件开发技术实验报告》就是典型的入门级实战材料它把 Android 开发最核心的三件事串成了一条线环境搭建、Activity 运用、UI 设计。别看它叫“实验报告”里面包含的源码、XML 布局、Intent 传参逻辑足够让一个新手把 Android 开发的完整流程跑通一遍。如果你正在找一份能照着敲、能跑起来、能理解 Android 四大组件之一 Activity 到底怎么工作的材料这份报告比很多视频教程都实在。它不跟你讲虚的直接上 JDK、Eclipse、Android SDK、ADT 的安装配置然后手把手写 MainActivity 跳转 OtherActivity最后用 LinearLayout 嵌套 TableLayout 做出一个带对话框的界面。整套流程走下来你对 Android 项目的目录结构、资源文件、清单文件、事件监听都会有一个肌肉记忆级别的认识。2. 环境搭建JDK、Eclipse、Android SDK 与 ADT 的完整配置链路2.1 为什么这套老工具链还值得跑一遍现在 Android 开发早就换成了 Android Studio Gradle但这份实验报告用的是 JDK Eclipse Android SDK ADT 的组合。你可能会问2025 年了还折腾 Eclipse 图什么答案很简单理解底层依赖关系。Android Studio 把很多东西封装成了黑匣子你点一下 Sync 它就把依赖下好了但 JDK 在哪、SDK 在哪、ADT 干了什么很多人是懵的。这套老工具链逼着你手动配环境变量、手动指定 SDK 路径、手动装插件走完一遍之后再回头看 Android Studio 的 Project Structure 面板你会知道每一栏对应的是什么东西。而且这份报告里的离线安装 SDK 方法对于网络受限或者需要固定版本的环境依然有参考价值。2.2 JDK 安装与环境变量配置实验报告里要求 JDK 6.0 以上现在你装 JDK 8 或 JDK 11 都可以Android 编译对 JDK 版本有要求但这份报告里的代码用 JDK 8 完全没问题。安装完 JDK 之后关键一步是配JAVA_HOME。很多人装完 JDK 直接在 cmd 里敲java -version发现能用就以为不用配环境变量了结果 Eclipse 启动时报No Java virtual machine found这就是血泪经验。# Windows 下配置 JAVA_HOME 和 Path # 新建系统变量 JAVA_HOME C:\Program Files\Java\jdk1.8.0_291 # 在 Path 变量末尾追加 %JAVA_HOME%\bin %JAVA_HOME%\jre\bin配完之后一定要开一个新的 cmd 窗口验证因为环境变量修改后旧窗口不会刷新。敲echo %JAVA_HOME%看路径对不对再敲java -version和javac -version两个都能输出且版本一致才算过关。如果java能用但javac不能用说明 Path 里只加了 jre 的 bin没加 jdk 的 bin这是最常见的翻车点。2.3 Eclipse 与 ADT 插件的安装细节Eclipse 下载的是 “Eclipse IDE for Java EE Developers” 版本解压就能用不需要安装程序。但 ADT 插件的安装是整套流程里最容易卡住的地方。报告里给的地址是http://dll-ssl.google.com/android/eclipse/这个地址现在早就失效了。常见做法是去 Android 开发者官网找 ADT 的离线包或者直接用已经集成好 ADT 的 Eclipse 版本。如果你非要在线装注意 Eclipse 版本和 ADT 版本的兼容性Indigo 配 ADT 18 左右比较稳版本差太多会出现插件装了但菜单不显示的情况。安装 ADT 的步骤是Help - Install New Software - Add - 填 Name 和 Location - 勾选 Developer Tools - Next - Finish - 重启 Eclipse。重启之后还要做一步关键配置Window - Preferences - Android - SDK Location把 Android SDK 的根目录填进去。这一步不配新建 Android 项目时不会报错但运行的时候会提示找不到目标平台很多人在这里卡半天。2.4 Android SDK 的在线与离线安装SDK Manager 是管理 Android 平台版本和工具的核心入口。在线安装就是打开 SDK Manager 勾选需要的 API 版本点 Install 等着下载。但报告里重点写了离线安装因为当年网络不稳定在线下载经常断。离线安装的逻辑是先下载android-sdk_r16-windows.zip解压到某个目录然后手动创建platforms、docs、samples、usb_driver、market_licensing这几个文件夹再把下载好的各个版本 zip 包解压到对应目录里。# 离线安装 SDK 的目录结构示例 D:\android-sdk-windows\ ├── platforms\ │ ├── android-8\ │ ├── android-10\ │ └── android-17\ ├── docs\ ├── samples\ ├── usb_driver\ ├── market_licensing\ ├── tools\ └── platform-tools\这里有个细节platform-tools文件夹里放的是adb.exe如果你下载的 tools 包里没有这个需要单独下载 platform-tools 并解压进去。另外环境变量里最好把platform-tools和tools都加到 Path这样在 cmd 里可以直接用adb和android命令。验证 SDK 装好没有可以敲adb version能输出版本号就说明 platform-tools 配置正确。3. Activity 与 Intent从页面跳转到数据传递的完整实现3.1 Activity 生命周期与跳转的基本逻辑Activity 是 Android 应用的门面一个 Activity 通常对应一个屏幕。这份实验报告里的两个小项目TestActivity01 和 TestActivity02分别覆盖了 Activity 跳转和数据传递两个核心场景。TestActivity01 的 MainActivity 里只有一个按钮点击按钮启动 OtherActivityOtherActivity 里只有一个 TextView。这个流程看似简单但包含了 Android 页面导航的基本模型Intent 作为信使startActivity 作为动作目标 Activity 在 AndroidManifest.xml 里注册。先看 MainActivity 的代码package com.example.test1; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button b; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b (Button) findViewById(R.id.button1); b.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 创建 Intent指定从 MainActivity 跳转到 second Intent intent new Intent(MainActivity.this, second.class); startActivity(intent); } }); } }这段代码的关键在onCreate方法里。setContentView(R.layout.activity_main)把 XML 布局文件加载进来然后findViewById(R.id.button1)拿到按钮实例。setOnClickListener注册点击事件在onClick回调里创建 Intent。new Intent(MainActivity.this, second.class)的第一个参数是当前上下文第二个参数是目标 Activity 的 Class 对象。startActivity(intent)执行跳转。这里有个常见错误目标 Activity 没有在 AndroidManifest.xml 里注册运行时会直接崩报ActivityNotFoundException。3.2 Intent 传参Bundle 与 putExtras 的配合TestActivity02 在跳转的基础上增加了数据传递。MainActivity 里把字符串 “中国” 通过 Intent 传到 OtherActivity 并显示出来。实现方式是用 Bundle 包装数据再通过putExtras塞进 Intent。// MainActivity 中发送数据 Intent testintent new Intent(); Bundle testbundle new Bundle(); testbundle.putString(name, 中国); testintent.putExtras(testbundle); testintent.setClass(TextMainActivity.this, test_2.class); startActivity(testintent);// test_2 中接收数据 Bundle tbd this.getIntent().getExtras(); String name tbd.getString(name); test.setText(name);发送端的逻辑是先 new 一个 Intent再 new 一个 Bundle用putString把键值对放进去然后putExtras把 Bundle 附加到 Intent 上最后setClass指定目标并启动。接收端在onCreate里用getIntent().getExtras()拿到 Bundle再用getString(name)取出数据。这里的 key 必须两边一致写错一个字母就取到 null界面显示空白。参数说明putString的第一个参数是键名第二个是值getString的参数就是键名。如果要传整数用putInt/getInt传布尔用putBoolean/getBoolean类型不匹配会抛异常。3.3 布局文件与 AndroidManifest 的注册两个 Activity 对应的 XML 布局都很简单。activity_main.xml里是一个 RelativeLayout 包一个 Buttontwo.xml里是一个 RelativeLayout 包一个 TextView。RelativeLayout 的特点是子控件通过相对位置定位比如android:layout_alignParentLefttrue表示靠父容器左边android:layout_marginLeft106dp表示左边距 106dp。这种布局方式在复杂界面里容易产生嵌套过深的问题但做简单页面很直观。AndroidManifest.xml 的注册是新手最容易漏的一步。每个 Activity 都要在application标签内加一个activity节点否则系统不知道这个类的存在。对于启动页还要在activity里加intent-filter和category android:nameandroid.intent.category.LAUNCHER /这样应用图标点击后才会进入这个 Activity。注意如果跳转时应用直接闪退先检查 AndroidManifest.xml 里目标 Activity 有没有注册再看类名和包名是否写对。这两个原因占了闪退问题的八成以上。4. UI 设计实战LinearLayout 嵌套与多输入对话框4.1 布局嵌套LinearLayout 套 TableLayout 再套 LinearLayout实验三的 UI 设计部分要求实现一个三层嵌套的布局最外层是纵向 LinearLayout里面依次放一个横向 LinearLayout四列、一个 TableLayout三行三列、一个纵向 LinearLayout四行。这种嵌套结构在 Android 早期开发里很常见因为当时 ConstraintLayout 还没普及复杂界面全靠 LinearLayout 和 RelativeLayout 一层层套。?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthfill_parent android:layout_heightfill_parent android:orientationvertical !-- 第一层横向 LinearLayout四列 -- LinearLayout android:orientationhorizontal android:layout_widthfill_parent android:layout_heightwrap_content android:layout_weight2 TextView android:textred android:gravitycenter android:background#CE0000 android:layout_widthwrap_content android:layout_heightfill_parent android:layout_weight1 / TextView android:textgreen android:gravitycenter android:background#00A600 android:layout_widthwrap_content android:layout_heightfill_parent android:layout_weight1 / TextView android:textblue android:gravitycenter android:background#0000CE android:layout_widthwrap_content android:layout_heightfill_parent android:layout_weight1 / TextView android:textyellow android:gravitycenter android:background#CECE00 android:layout_widthwrap_content android:layout_heightfill_parent android:layout_weight1 / /LinearLayout !-- 第二层TableLayout三行三列 -- TableLayout android:layout_widthfill_parent android:layout_heightwrap_content android:stretchColumns* TableRow TextView android:text1-1 android:gravitycenter / TextView android:text1-2 android:gravitycenter / TextView android:text1-3 android:gravitycenter / /TableRow TableRow TextView android:text2-1 android:gravitycenter / TextView android:text2-2 android:gravitycenter / TextView android:text2-3 android:gravitycenter / /TableRow TableRow TextView android:text3-1 android:gravitycenter / TextView android:text3-2 android:gravitycenter / TextView android:text3-3 android:gravitycenter / /TableRow /TableLayout !-- 第三层纵向 LinearLayout四行 -- LinearLayout android:orientationvertical android:layout_widthfill_parent android:layout_heightwrap_content android:layout_weight1 TextView android:textrow1 android:gravitycenter / TextView android:textrow2 android:gravitycenter / TextView android:textrow3 android:gravitycenter / TextView android:textrow4 android:gravitycenter / /LinearLayout /LinearLayout这段布局里有两个关键属性layout_weight和stretchColumns。layout_weight用来分配剩余空间值越大占的比例越大。第一层横向 LinearLayout 的layout_weight2和第三层纵向 LinearLayout 的layout_weight1配合让上半部分占 2/3下半部分占 1/3。stretchColumns*让 TableLayout 的所有列均匀拉伸填满宽度。如果去掉这个属性表格列宽会按内容自适应看起来会挤在一起。4.2 多输入对话框AlertDialog 与 EditText 的组合实验三的第二部分要求实现一个多输入框的对话框用 LinearLayout 布局包含两个 TextView 和两个 EditText点击按钮后输出内容。对话框在 Android 里用 AlertDialog.Builder 构建自定义布局通过setView方法塞进去。// 自定义对话框布局的 Java 代码 AlertDialog.Builder builder new AlertDialog.Builder(this); View dialogView getLayoutInflater().inflate(R.layout.dialog_layout, null); builder.setTitle(请输入信息); builder.setView(dialogView); EditText input1 dialogView.findViewById(R.id.edit1); EditText input2 dialogView.findViewById(R.id.edit2); builder.setPositiveButton(确定, new DialogInterface.OnClickListener() { Override public void onClick(DialogInterface dialog, int which) { String val1 input1.getText().toString(); String val2 input2.getText().toString(); // 用 Toast 输出结果 Toast.makeText(MainActivity.this, 输入1 val1 输入2 val2, Toast.LENGTH_LONG).show(); } }); builder.setNegativeButton(取消, null); builder.show();这段代码的逻辑是先创建 AlertDialog.Builder然后用 LayoutInflater 加载自定义的 XML 布局文件通过setView把布局设置到对话框里。接着从 dialogView 里找到两个 EditText 的引用在确定按钮的点击回调里读取输入内容用 Toast 显示出来。参数说明setPositiveButton的第二个参数是监听器如果不需要处理逻辑可以传 nullToast.makeText的第三个参数控制显示时长LENGTH_SHORT约 2 秒LENGTH_LONG约 3.5 秒。注意在对话框的按钮回调里直接用 Activity 的 this 可能会报错因为回调发生在对话框的上下文里。正确做法是用MainActivity.this明确指定外部类的实例。5. 避坑与排查环境、跳转、布局中最容易翻车的几个点5.1 环境变量配了但 Eclipse 找不到 JDK现象cmd 里java -version正常但启动 Eclipse 时报 “No Java virtual machine found”。原因通常是 Eclipse 只认JAVA_HOME或者只认 Path 里的 javaw.exe而你的配置只满足了其中一个。解决方法是确保JAVA_HOME指向 JDK 根目录不是 jre 目录并且在 Eclipse 的eclipse.ini文件里显式指定-vm参数指向javaw.exe的完整路径。这个坑在同时装了多个 JDK 的机器上尤其常见。5.2 Activity 跳转闪退但控制台没明显报错现象点击按钮后应用直接退出Logcat 里只有一行ActivityNotFoundException。原因就是目标 Activity 没有在 AndroidManifest.xml 里注册。Android 系统在启动 Activity 之前会检查清单文件找不到对应声明就直接抛异常。解决方法是打开 AndroidManifest.xml在application标签内添加activity android:name.second /注意类名前面的点号不能省它表示当前包路径。5.3 Intent 传参取到 null现象跳转成功但目标页面的 TextView 显示空白调试发现getString(name)返回 null。原因通常是发送端和接收端的 key 不一致比如发送端写name接收端写NameJava 是大小写敏感的。另一个可能是发送端用了putExtra而不是putExtras单个键值对用putExtra没问题但接收端要用getStringExtra而不是getExtras().getString。解决方法是统一用 Bundle 包装发送端putExtras(bundle)接收端getExtras().getString(key)key 用常量定义避免手写错误。5.4 布局文件改了但界面没变化现象在 XML 里改了控件位置或颜色重新运行应用发现界面还是老样子。原因通常是 Eclipse 的自动构建没有触发或者 ADT 的布局预览缓存没刷新。解决方法是 Project - Clean 清理项目然后重新 Run。如果还不行检查setContentView里引用的布局文件名是否和修改的文件一致有时候复制粘贴代码会忘记改R.layout.xxx的引用。5.5 SDK Manager 打不开或列表加载不出来现象双击 SDK Manager.exe 后窗口一闪而过或者打开了但列表是空的。原因是 SDK Manager 依赖的 Java 版本不匹配或者tools文件夹里的android.bat找不到 java.exe。解决方法是编辑android.bat找到set java_exe那一行把路径改成你 JDK 里 java.exe 的绝对路径。列表加载不出来通常是网络问题可以在 SDK Manager 的 Settings 里勾选 “Force https://... sources to be fetched using http://...”或者直接用离线包安装。6. 二次开发与改造从实验代码到可复用模块这份实验报告的代码虽然简单但它是很好的二次开发起点。我一般会从三个方向改造把 Intent 传参封装成工具类、把对话框封装成可复用的 DialogFragment、把布局文件抽成 include 标签减少重复。先看 Intent 传参的封装。实验里的写法是每个 Activity 都手动 new Intent、new Bundle、putString代码重复且容易写错 key。可以写一个IntentUtils类public class IntentUtils { // 启动 Activity 并传递字符串参数 public static void startWithString(Context context, Class? target, String key, String value) { Intent intent new Intent(context, target); intent.putExtra(key, value); context.startActivity(intent); } // 从 Activity 中读取字符串参数 public static String getStringExtra(Activity activity, String key) { return activity.getIntent().getStringExtra(key); } }调用的时候就是IntentUtils.startWithString(this, second.class, name, 中国)接收端String name IntentUtils.getStringExtra(this, name)。这样 key 只需要在一个地方维护改起来方便。参数说明Context参数用 Activity 的 this 或者 ApplicationContext 都可以但启动 Activity 必须用 Activity 类型的 Context用 ApplicationContext 会报错。再看对话框的封装。实验里用 AlertDialog.Builder 直接在 Activity 里写如果多个页面都要用类似的输入对话框代码会散落各处。改成 DialogFragment 之后对话框的生命周期独立管理旋转屏幕也不会丢失状态。具体做法是新建一个类继承 DialogFragment重写onCreateDialog方法在里面构建 AlertDialog。调用的时候用new MyDialogFragment().show(getSupportFragmentManager(), tag)。这样改造之后对话框的布局和逻辑都收在一个类里Activity 只需要关心回调结果。布局文件的 include 改造也很实用。实验三的三层嵌套布局里横向 LinearLayout 和纵向 LinearLayout 的结构类似可以抽成单独的 XML 文件用include layoutlayout/row_layout /引入。这样主布局文件会清爽很多修改行样式的时候也只需要改一个文件。不过要注意 include 标签不能覆盖被包含布局的 layout_weight 属性如果需要不同的权重得在 include 里重新指定android:layout_width和android:layout_height。验证改造是否成功的方法很简单把改造后的代码跑一遍实验里的三个场景看跳转是否正常、传参是否显示、对话框是否弹出。如果都正常再试着加一个新页面用封装好的工具类跳转并传一个整数参数看能不能取到。能取到就说明封装是通的。从那以后我每次做 Android 页面跳转都会先把 Intent 传参的 key 定义成静态常量再写一个工具方法统一处理避免手写字符串带来的玄学问题。希望这份拆解能帮到你把这份实验报告里的代码真正跑起来、改起来。本文还有配套的精品资源点击获取