☰
Android移动应用开发入门:从实验报告到Activity与UI实战
2026/10/19 2:25:17 网站建设 项目流程

简介:这份实验报告面向软件学院修读移动应用软件开发技术课程的学生,聚焦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 里只有一个按钮,点击按钮启动 OtherActivity,OtherActivity 里只有一个 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 包一个 Button,two.xml里是一个 RelativeLayout 包一个 TextView。RelativeLayout 的特点是子控件通过相对位置定位,比如android:layout_alignParentLeft="true"表示靠父容器左边,android:layout_marginLeft="106dp"表示左边距 106dp。这种布局方式在复杂界面里容易产生嵌套过深的问题,但做简单页面很直观。

AndroidManifest.xml 的注册是新手最容易漏的一步。每个 Activity 都要在<application>标签内加一个<activity>节点,否则系统不知道这个类的存在。对于启动页,还要在<activity>里加<intent-filter>和<category android:name="android.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 version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <!-- 第一层:横向 LinearLayout,四列 --> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2"> <TextView android:text="red" android:gravity="center" android:background="#CE0000" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" /> <TextView android:text="green" android:gravity="center" android:background="#00A600" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" /> <TextView android:text="blue" android:gravity="center" android:background="#0000CE" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" /> <TextView android:text="yellow" android:gravity="center" android:background="#CECE00" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="1" /> </LinearLayout> <!-- 第二层:TableLayout,三行三列 --> <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="*"> <TableRow> <TextView android:text="1-1" android:gravity="center" /> <TextView android:text="1-2" android:gravity="center" /> <TextView android:text="1-3" android:gravity="center" /> </TableRow> <TableRow> <TextView android:text="2-1" android:gravity="center" /> <TextView android:text="2-2" android:gravity="center" /> <TextView android:text="2-3" android:gravity="center" /> </TableRow> <TableRow> <TextView android:text="3-1" android:gravity="center" /> <TextView android:text="3-2" android:gravity="center" /> <TextView android:text="3-3" android:gravity="center" /> </TableRow> </TableLayout> <!-- 第三层:纵向 LinearLayout,四行 --> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:text="row1" android:gravity="center" /> <TextView android:text="row2" android:gravity="center" /> <TextView android:text="row3" android:gravity="center" /> <TextView android:text="row4" android:gravity="center" /> </LinearLayout> </LinearLayout>

这段布局里有两个关键属性:layout_weight和stretchColumns。layout_weight用来分配剩余空间,值越大占的比例越大。第一层横向 LinearLayout 的layout_weight="2"和第三层纵向 LinearLayout 的layout_weight="1"配合,让上半部分占 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的第二个参数是监听器,如果不需要处理逻辑可以传 null;Toast.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",接收端写"Name",Java 是大小写敏感的。另一个可能是发送端用了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 layout="@layout/row_layout" />引入。这样主布局文件会清爽很多,修改行样式的时候也只需要改一个文件。不过要注意 include 标签不能覆盖被包含布局的 layout_weight 属性,如果需要不同的权重,得在 include 里重新指定android:layout_width和android:layout_height。

验证改造是否成功的方法很简单:把改造后的代码跑一遍实验里的三个场景,看跳转是否正常、传参是否显示、对话框是否弹出。如果都正常,再试着加一个新页面,用封装好的工具类跳转并传一个整数参数,看能不能取到。能取到就说明封装是通的。

从那以后我每次做 Android 页面跳转,都会先把 Intent 传参的 key 定义成静态常量,再写一个工具方法统一处理,避免手写字符串带来的玄学问题。希望这份拆解能帮到你,把这份实验报告里的代码真正跑起来、改起来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询