
简介这份实验报告面向软件学院修读移动应用软件开发技术课程的学生聚焦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和javacCLASSPATH里的.表示当前目录不加的话编译时可能找不到自己写的类。参数上唯一要注意的是 JDK 路径不要带空格Program Files这种目录会让某些老版本 SDK 工具解析失败。验证方式就是报告里说的写一个test.javapublic 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 SoftwareLocation 填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:allowBackuptrue android:icondrawable/ic_launcher android:labelstring/app_name android:themestyle/AppTheme activity android:name.MainActivity android:labelstring/app_name intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity activity android:name.second android:labelstring/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:idid/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 - onStopsecond 走onCreate - onStart - onResume。按返回键时second 走onPause - onStop - onDestroyMainActivity 走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_widthfill_parent android:layout_heightfill_parent android:orientationvertical 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 / /LinearLayout TableLayout android:layout_widthfill_parent android:layout_heightwrap_content android:stretchColumns* !-- 三行三列 -- /TableLayout LinearLayout android:orientationvertical android:layout_widthfill_parent android:layout_heightwrap_content android:layout_weight1 !-- 四行 -- /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点击按钮后输出。核心代码是构建一个带自定义布局的 AlertDialogLayoutInflater 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 code13”原因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_widthwrap_content又写了layout_weight1权重会覆盖宽度计算导致实际宽度不可控。解决用权重分配空间时把对应方向的宽或高设为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.2layout_weight整数按比例分配剩余空间Intent key字符串发送方和接收方必须一致验证方法每个 Activity 的onCreate里加一行Log.d(TestAll, onCreate: getClass().getSimpleName())运行后看 Logcat 输出顺序。如果跳转时只看到发送方的onPause没看到接收方的onCreate说明 Intent 目标类没找到如果两个都看到了但界面空白说明布局文件里根元素没有设置android:orientation或者背景色和文字颜色相同。从那以后我每次搭 Android 环境都会先把java -version、adb devices、SDK Manager 平台列表这三项截图存档后面出任何问题先对照这三张图能省掉大量“到底是环境问题还是代码问题”的纠结。希望帮到你。本文还有配套的精品资源点击获取