☰
Android开发环境搭建与Activity通信复现:从2013年实验报告到可运行Demo
2026/10/18 2:21:05 网站建设 项目流程

简介:这份实验报告面向软件学院修读移动应用软件开发技术课程的学生,聚焦Android平台开发入门,帮助读者完成从环境搭建到界面设计的完整实验流程。内容涵盖JDK安装与环境变量配置、Eclipse与Android SDK的在线及离线安装、ADT插件部署,并延伸至Activity的创建、生命周期管理与Intent跳转,以及TextView、Button、ImageView等基础控件和LinearLayout、RelativeLayout、GridLayout等布局管理器的UI设计实践。资源包为1个doc文档,大小约1.63MB,结构按实验项目分节,配有安装目录截图与验证步骤说明,便于对照操作与撰写报告。目前已有767人学习下载,适合需要完成课程实验、巩固Android开发基础或准备移动应用开发入门实践的学生参考,可据此梳理实验流程、理解Activity作用并掌握基本UI构建方法。

1. 从一份 2013 年的实验报告说起:Android 开发环境搭建与 Activity 通信到底该怎么复现

翻到一份 2013 年 6 月的移动应用软件开发技术实验报告,里面完整记录了 JDK 6.0、Eclipse、Android SDK r16、ADT 插件这套“老四件”的安装流程,以及 Activity 跳转、Intent 传值、LinearLayout 嵌套、AlertDialog 多输入框这几个核心实验。放到今天看,这套工具链确实过时了,但如果你正在带课、补实验、或者想理解 Android 开发最底层的“环境—组件—UI”三层结构,这份报告反而比很多新教程更干净:它没有 Gradle 版本冲突、没有 AndroidX 迁移、没有 Kotlin 协程,所有注意力都落在 Activity 生命周期和 Intent 传参这两个真正的地基上。这篇文章不打算复述报告原文,而是把它拆成能直接抄作业的复现路径,顺带把当年踩过的坑和今天仍然适用的排查思路讲清楚。适合谁看:需要交实验报告的学生、要快速搭一套最小 Android 验证环境的开发者、以及想搞明白“为什么我的 Activity 跳过去是空白的”这类问题的从业者。

2. 环境搭建:JDK、Eclipse、SDK、ADT 四件套的安装顺序与验证方法

2.1 为什么必须按 JDK → Eclipse → SDK → ADT 的顺序来

这套工具链的依赖关系是单向的:Eclipse 本身是 Java 程序,没有 JDK 连启动都启动不了;Android SDK 里的工具(比如 aapt、dx)需要 JDK 提供的 Java 运行时;ADT 是 Eclipse 的插件,它要调用 SDK 的目录结构来识别 Android 平台版本。顺序错了不会立刻报错,但会在某个环节突然告诉你“找不到 Java 虚拟机”或者“SDK Location 无效”,这种延迟报错最消耗时间。

我一般会先确认三件事:java -version能输出 1.6 以上版本;echo %JAVA_HOME%指向 JDK 安装根目录而不是 bin 目录;Eclipse 解压后的目录里eclipse.ini没有写死一个不存在的 JRE 路径。这三步过了,后面基本不会出玄学问题。

2.2 JDK 安装与环境变量配置:JAVA_HOME 和 Path 到底怎么填

报告里只写了“新建 JAVA_HOME”,但没写 Path 怎么改,这是当年很多人卡住的地方。完整做法是:

# 假设 JDK 安装在 D:\Java\jdk1.6.0_45 # 新建系统变量 JAVA_HOME = D:\Java\jdk1.6.0_45 # 编辑 Path,在末尾追加(注意分号) Path = %JAVA_HOME%\bin;%Path% # 可选:新建 CLASSPATH CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

逻辑说明:JAVA_HOME是给其他工具(Eclipse、SDK、ADT)读的,它们靠这个变量找 Java 运行时;Path里的%JAVA_HOME%\bin是给命令行用的,让你在任何目录都能敲java和javac;CLASSPATH里的.表示当前目录,不加的话编译时可能找不到自己写的类。参数上唯一要注意的是 JDK 路径不要带空格,Program Files这种目录会让某些老版本 SDK 工具解析失败。

验证方式就是报告里说的写一个test.java:

public class test { public static void main(String[] args) { System.out.println("JDK install OK"); } }

编译运行javac test.java和java test,能输出JDK install OK就说明环境变量生效了。如果报“找不到或无法加载主类”,九成是 CLASSPATH 没加.,或者你在大括号里多写了public static void main之外的入口。

2.3 Eclipse 与 Android SDK 的离线安装:目录结构和文件夹命名有讲究

Eclipse 解压即用,但 Android SDK 的离线安装有个容易翻车的点:报告里要求新建platforms、docs、samples、usb_driver、market_licensing这几个文件夹,然后把下载的 zip 包解压进去。这里的关键是文件夹名称必须和 SDK Manager 预期的完全一致,少一个字母它就不认。

常见做法是先把android-sdk_r16-windows.zip解压到D:\android-sdk-windows,然后手动创建上述子目录,再把各个平台包解压到platforms\android-8这种路径下。注意android-2.2_r01-windows.zip解压后应该形成platforms\android-8目录,而不是直接散落在platforms根下。判断标准是:打开 SDK Manager,如果左侧列表里能看到已安装的 Android 2.2 (API 8) 并且状态是绿色的勾,就说明目录结构对了。

ADT 安装走 Eclipse 的Help -> Install New Software,Location 填http://dl-ssl.google.com/android/eclipse/。这一步现在大概率连不上,但当年是标准做法。安装完重启 Eclipse,在Window -> Preferences -> Android里把 SDK Location 指到D:\android-sdk-windows,点 OK 后如果列表里能刷出已安装的平台版本,环境就算通了。

提示:如果 SDK Manager 打开后一片空白或者报 “Failed to fetch URL”,先检查https和http的区别,老版本 SDK Manager 对 https 支持不好,把地址里的 https 改成 http 往往能解决。

3. Activity 与 Intent:从按钮跳转到跨页面传值的完整实现

3.1 两个 Activity 的注册与启动:为什么你的跳转没有反应

报告里实验二第一个例子是 MainActivity 上放一个按钮,点击后启动 OtherActivity。源码里Intent intent = new Intent(MainActivity.this, second.class); startActivity(intent);这行本身没问题,但很多人复现时跳转失败,原因是忘记在 AndroidManifest.xml 里注册第二个 Activity。

<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".second" android:label="@string/title_activity_second" > </activity> </application>

逻辑说明:<activity android:name=".second">里的.second是相对包名的简写,等价于com.example.test1.second。如果类名大小写和这里不一致,运行时会抛ActivityNotFoundException。参数上android:label是标题栏文字,不写也不影响跳转,但写错了会在标题栏显示成类名。

另一个常见问题是按钮点击没反应,检查setOnClickListener是否在setContentView之后调用,以及findViewById(R.id.button1)的 ID 是否和 XML 里的android:id="@+id/button1"完全一致。ID 不一致时不会报错,只是返回 null,然后点击时抛空指针。

3.2 Intent 传值:Bundle 和 putExtras 的配合方式

实验二第二个例子要把 MainActivity 里的字符串“中国”传到 OtherActivity 显示。报告里用了Bundle加putExtras的方式:

// 发送方 Intent testintent = new Intent(); Bundle testbundle = new Bundle(); testbundle.putString("name", "中国"); testintent.putExtras(testbundle); testintent.setClass(TextMainActivity.this, test_2.class); startActivity(testintent); // 接收方 Bundle tbd = this.getIntent().getExtras(); String name = tbd.getString("name"); test.setText(name);

逻辑说明:Bundle是一个键值对容器,putString的 key 是"name",接收方必须用同一个 key 去取。putExtras把整个 Bundle 塞进 Intent,接收方用getIntent().getExtras()取回来。参数上要注意getString("name")如果 key 不存在会返回 null,直接setText(null)不会崩溃但显示空白,所以最好加一个判空。

更简洁的写法是直接用intent.putExtra("name", "中国"),接收方用getIntent().getStringExtra("name"),省掉 Bundle 这一层。两种方式效果一样,但报告里用 Bundle 是为了演示多参数传递的场景,实际项目中如果参数超过三个,用 Bundle 打包更清晰。

注意:Intent 传值有大小限制,Bundle 整体建议不超过 1MB,传大图或长字符串会抛TransactionTooLargeException。这个限制在 2013 年的设备上更明显,现在虽然放宽了,但跨进程传大数据仍然要走文件或 ContentProvider。

3.3 生命周期验证:跳转过去再返回,数据还在不在

报告里没有展开讲生命周期,但这是 Activity 实验最容易出问题的地方。我一般会加几个日志点来验证:

@Override protected void onPause() { super.onPause(); Log.d("LifeCycle", "MainActivity onPause"); } @Override protected void onResume() { super.onResume(); Log.d("LifeCycle", "MainActivity onResume"); }

逻辑说明:从 MainActivity 跳到 second 时,MainActivity 会走onPause -> onStop,second 走onCreate -> onStart -> onResume。按返回键时,second 走onPause -> onStop -> onDestroy,MainActivity 走onRestart -> onStart -> onResume。如果返回后数据丢了,说明你把数据存在了局部变量里,而 Activity 被销毁重建了。参数上Log.d的 tag 用"LifeCycle"方便在 Logcat 里过滤,实际调试时可以用adb logcat -s LifeCycle只看这一条。

4. UI 设计实验:LinearLayout 嵌套、TableLayout 与 AlertDialog 多输入框

4.1 布局嵌套分析:三层结构怎么拆

报告里实验三第一个界面要求最外层纵向 LinearLayout,里面包含横向 LinearLayout(四列)、TableLayout(三行三列)、纵向 LinearLayout(四行)。这种嵌套布局在 2013 年是标准做法,今天虽然推荐 ConstraintLayout,但理解嵌套权重(layout_weight)仍然是基本功。

<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <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" /> </LinearLayout> <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="*"> <!-- 三行三列 --> </TableLayout> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"> <!-- 四行 --> </LinearLayout> </LinearLayout>

逻辑说明:layout_weight表示剩余空间的分配比例,横向 LinearLayout 里三个 TextView 各占 1 份,所以三等分。外层纵向 LinearLayout 里,横向布局权重 2、底部纵向布局权重 1,表示前者占 2/3 高度。参数上fill_parent和match_parent在 API 8 以上等价,但老版本 SDK 只认fill_parent,混用会报错。stretchColumns="*"让 TableLayout 的列自动拉伸填满宽度。

4.2 AlertDialog 多输入框:两个 EditText 怎么取值

报告里要求用 LinearLayout 放两个 TextView 和两个 EditText,点击按钮后输出。核心代码是构建一个带自定义布局的 AlertDialog:

LayoutInflater inflater = getLayoutInflater(); View dialogView = inflater.inflate(R.layout.dialog_layout, null); final EditText input1 = (EditText) dialogView.findViewById(R.id.edit1); final EditText input2 = (EditText) dialogView.findViewById(R.id.edit2); new AlertDialog.Builder(this) .setTitle("多输入框") .setView(dialogView) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String v1 = input1.getText().toString(); String v2 = input2.getText().toString(); Toast.makeText(MainActivity.this, v1 + " - " + v2, Toast.LENGTH_LONG).show(); } }) .setNegativeButton("取消", null) .show();

逻辑说明:LayoutInflater把 XML 布局转成 View 对象,setView把它塞进对话框。input1和input2必须声明为final,因为匿名内部类要访问它们。参数上Toast.LENGTH_LONG显示约 3.5 秒,LENGTH_SHORT约 2 秒。如果点击确定后 Toast 不显示,检查MainActivity.this是否写成了this,在匿名内部类里this指向的是OnClickListener而不是 Activity。

提示:AlertDialog 在 Activity 被销毁后如果还显示着,会抛WindowLeaked异常。常见做法是在onDestroy里调用dialog.dismiss(),或者用DialogFragment代替直接 new AlertDialog。

5. 避坑与排查:环境、跳转、布局三类问题的现场记录

5.1 现象:Eclipse 启动报 “Java was started but returned exit code=13”

原因:Eclipse 位数和 JDK 位数不匹配。2013 年很多机器是 64 位 Windows 7,但装的 JDK 是 32 位,Eclipse 下载的又是 64 位版本。解决:统一成 32 位或统一成 64 位,最稳的是全部用 32 位,因为当年 ADT 插件对 64 位支持不完善。

5.2 现象:SDK Manager 里看不到已安装的平台

原因:离线解压时目录层级多了一层。比如android-2.2_r01-windows.zip解压后得到android-2.2_r01-windows文件夹,里面才是android-8,但 SDK Manager 只认platforms\android-8这一层。解决:把内层目录直接剪切到platforms下,确保路径是platforms\android-8\而不是platforms\android-2.2_r01-windows\android-8\。

5.3 现象:Activity 跳转后应用崩溃,Logcat 显示 “Unable to find explicit activity class”

原因:AndroidManifest.xml 里没有注册第二个 Activity,或者注册的android:name写错了包路径。解决:确认<activity android:name=".second">里的.second和实际类名大小写一致,如果类在子包里,要写全com.example.test1.sub.second。

5.4 现象:布局预览正常,运行后控件位置全乱

原因:layout_weight和layout_width/height配合错误。比如横向 LinearLayout 里子控件写了layout_width="wrap_content"又写了layout_weight="1",权重会覆盖宽度计算,导致实际宽度不可控。解决:用权重分配空间时,把对应方向的宽或高设为0dp,让权重完全接管。

5.5 现象:Toast 不显示或延迟很久才显示

原因:在非 UI 线程调用了 Toast,或者连续弹多个 Toast 时被系统排队。解决:确保 Toast 在runOnUiThread里执行,连续弹窗时先toast.cancel()再show()。另外 Android 4.0 以后 Toast 不能自定义 View 了,报告里如果用了setView会失效。

6. 从实验报告到可运行 Demo:一套最小验证流程与参数速查

把上面几个实验串起来,我一般会建一个TestAll工程,包含三个按钮:第一个跳转到空白 Activity,第二个跳转并传字符串,第三个弹出多输入框对话框。这样一次运行就能验证环境、Intent、UI 三条链路是否都通。

具体操作顺序是:先跑 JDK 验证程序,确认java -version输出正确;再启动 Eclipse 并检查 ADT 是否加载(菜单栏有 Android 相关选项);然后新建 Android Project,最低版本选 API 8,目标版本选 API 17;把三个 Activity 和对应布局文件写进去,在 Manifest 里注册;最后连真机或启动模拟器,点一遍三个按钮。

参数速查表:

项目推荐值说明
JDK 版本1.6 或 1.71.8 以上 ADT 可能不兼容
Eclipse 版本Indigo SR2报告里用的就是这个
SDK 版本r16离线包对应版本
目标 API17兼容 ADT 和大部分设备
最低 API8覆盖 Android 2.2
layout_weight整数按比例分配剩余空间
Intent key字符串发送方和接收方必须一致

验证方法:每个 Activity 的onCreate里加一行Log.d("TestAll", "onCreate: " + getClass().getSimpleName()),运行后看 Logcat 输出顺序。如果跳转时只看到发送方的onPause没看到接收方的onCreate,说明 Intent 目标类没找到;如果两个都看到了但界面空白,说明布局文件里根元素没有设置android:orientation或者背景色和文字颜色相同。

从那以后我每次搭 Android 环境,都会先把java -version、adb devices、SDK Manager 平台列表这三项截图存档,后面出任何问题先对照这三张图,能省掉大量“到底是环境问题还是代码问题”的纠结。希望帮到你。

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

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

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

立即咨询