☰
Android环境搭建与Activity传参实战:从实验报告到避坑指南
2026/10/19 2:25:05 网站建设 项目流程

简介:这份实验报告面向软件学院修读移动应用软件开发技术课程的学生,聚焦Android平台开发入门,帮助读者完成从环境搭建到界面设计的完整实践训练。资源包内含1个doc文档,大小约1.63MB,以文字与截图结合的形式记录实验过程,便于对照操作与整理笔记。报告围绕Android系统环境搭建、Activity运用、Android应用UI设计(一)(二)等实验项目展开,具体涵盖JDK安装与JAVA_HOME环境变量配置、Eclipse与Android SDK的在线及离线安装、ADT插件部署,以及Activity生命周期、Intent跳转、TextView与Button等基础控件、LinearLayout与RelativeLayout等布局管理器的使用。内容按实验目的、内容原理、操作步骤与结果验证组织,读者可据此掌握Android开发基本流程,理解Activity作用与UI构建方法,为独立开发简单应用打下基础。目前已有767人学习下载,适合作为课程实验参考与期末复习资料。

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

翻到一份软件学院移动应用软件开发技术实验报告,时间戳停在 2013 年 6 月,实验环境是 Windows 7 加 Eclipse。很多人第一反应是“这都什么年代的东西了”,但如果你带过新人、做过移动应用课程设计评审,会发现一个反直觉的事实:今天大量 Android 入门项目翻车,不是死在 Kotlin 协程或者 Compose 状态管理上,而是死在环境变量没配对、Activity 没在清单里注册、Intent 传参取不到值这三件事上。这份报告的价值恰恰在于它把 Android 开发最底层的三块骨头——JDK/SDK/ADT 环境搭建、Activity 与 Intent 跳转、UI 布局嵌套——用最原始的方式拆了一遍。它适合两类人:一是刚接触 Android、需要一份能照着走通的实验流程的在校生;二是需要快速回顾“原始 Android 工程结构长什么样”的从业者。下面我不复述报告原文,而是把它当成一个可复现的工程包来拆。

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

2.1 为什么安装顺序不能乱

这份实验报告里列的顺序是 JDK → Eclipse → Android SDK → ADT。这个顺序不是随便排的,它对应一条硬依赖链:Eclipse 本身是 Java 程序,没有 JDK 它启动不了;ADT 是 Eclipse 的插件,没有 Eclipse 它无处安装;ADT 安装后需要指向一个已经解压好的 SDK 目录,没有 SDK 它配置不生效。所以四者必须按这个顺序来,中间任何一步跳过,后面都会以“看起来装好了但新建工程报错”的形式还债。

常见做法是先把 JDK 装到默认路径,再解压 Eclipse 到一个不含中文和空格的目录,比如D:\dev\eclipse,然后把 SDK 解压到D:\dev\android-sdk-windows,最后在 Eclipse 里装 ADT 并指向这个 SDK 路径。注意,路径里带中文或空格是新手最容易踩的坑,后面会专门讲。

2.2 JDK 安装与环境变量配置

报告里要求 JDK 6.0 以上,配置JAVA_HOME,然后写一个test.java验证。这一步的核心不是装 JDK,而是让命令行能识别java和javac。配置环境变量的逻辑是:JAVA_HOME指向 JDK 安装根目录,然后在Path里追加%JAVA_HOME%\bin。这样做的原因是,以后如果换 JDK 版本,只需要改JAVA_HOME一个地方,Path不用动。

验证代码如下:

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

编译运行命令:

javac test.java java test

逻辑说明:javac负责把.java编译成.class,java负责运行。如果javac提示“不是内部或外部命令”,说明Path没配好;如果java能运行但报UnsupportedClassVersionError,说明编译和运行的 JDK 版本不一致。参数上,JAVA_HOME的值必须是 JDK 根目录,不能写成bin目录,这是高频错误。

2.3 Eclipse 与 ADT 插件的安装

Eclipse 下载的是 “Eclipse IDE for Java EE Developers” 版本,解压即用。ADT 的安装路径是Help -> Install New Software,在 Location 里填 ADT 的更新地址,然后勾选 Developer Tools 一路 Next。安装完成后必须重启 Eclipse,否则插件不生效。

重启后还有关键一步:Windows -> Preference -> Android,在 SDK Location 里填入 SDK 解压路径。这一步不做,新建 Android 工程时 Eclipse 会报 “No Android SDK found”。报告里要求截图,本质上就是确认这个路径配置成功。

2.4 SDK 在线更新与离线安装的取舍

SDK Manager 打开后,在线更新会列出所有可用的 Platform、Tools、Google APIs。报告里同时给了离线安装方案:先解压android-sdk_r16-windows.zip,手动建platforms、docs、samples、usb_driver、market_licensing这几个文件夹,再把下载好的各个版本 zip 放进去。

这里给一个对比表,方便判断用哪种方式:

方式适用场景优点缺点
在线更新网络稳定、需要最新组件自动处理依赖下载慢、容易断
离线安装网络受限、需要固定版本版本可控、可批量部署需手动建目录、易放错位置

离线安装时,platforms文件夹下每个版本要解压成独立子目录,比如android-8、android-10,不能把所有 zip 堆在一起。tools_r06-windows.zip要解压覆盖到 SDK 根目录的tools文件夹。这些细节报告里没展开,但实际复现时少做一步就会导致 SDK Manager 识别不到已安装平台。

3. Activity 与 Intent 传参:从 TestActivity01 到 TestActivity02 的完整实现

3.1 Activity 跳转的最小工程结构

实验二要求做两个应用:TestActivity01 只做跳转,TestActivity02 在跳转时把字符串“中国”传过去。这两个实验覆盖了 Activity 最核心的两个能力:启动和传参。

先看 TestActivity01 的 MainActivity。报告里的代码用了一个 Button,点击后startActivity(intent)跳到second。这里有一个容易被忽略的点:second这个 Activity 必须在AndroidManifest.xml里注册,否则运行时会直接崩,报ActivityNotFoundException。报告源码里没贴清单文件,但这是必做步骤。

// MainActivity.java 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:指定从当前 Activity 跳到 second Intent intent = new Intent(MainActivity.this, second.class); startActivity(intent); } }); } }

逻辑说明:new Intent(MainActivity.this, second.class)是显式 Intent,两个参数分别是上下文和目标 Activity 的 Class 对象。startActivity只负责启动,不关心目标 Activity 怎么处理。参数上,MainActivity.this不能写成this,因为在匿名内部类里this指向的是OnClickListener,不是 Activity。

对应的布局activity_main.xml只放一个 Button,two.xml只放一个 TextView。这里不重复贴,重点看清单注册:

<!-- AndroidManifest.xml 片段 --> <application ...> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- second 必须注册,否则跳转崩溃 --> <activity android:name=".second" /> </application>

3.2 用 Bundle 通过 Intent 传递数据

TestActivity02 在跳转时多了一步:把“中国”放进 Bundle,再塞进 Intent。接收端在onCreate里通过getIntent().getExtras()取出 Bundle,再读字符串。

发送端代码:

// TextMainActivity.java Intent testintent = new Intent(); Bundle testbundle = new Bundle(); testbundle.putString("name", "中国"); // key 是 name testintent.putExtras(testbundle); testintent.setClass(TextMainActivity.this, test_2.class); startActivity(testintent);

接收端代码:

// test_2.java Bundle tbd = this.getIntent().getExtras(); String name = tbd.getString("name"); // 用同一个 key 取值 test.setText(name);

逻辑说明:putString和getString的 key 必须完全一致,大小写敏感。getExtras()可能返回 null,如果发送端没有putExtras,接收端直接调用getString会空指针。稳妥写法是先判断tbd != null。参数上,Bundle 支持基本类型、String、Parcelable、Serializable,传自定义对象需要实现 Parcelable 或 Serializable,这是后续实验的常见扩展点。

3.3 两个实验的差异与验证方法

TestActivity01 验证的是“能不能跳过去”,TestActivity02 验证的是“跳过去之后数据还在不在”。验证方法很简单:运行后点击按钮,看第二个界面是否显示“中国”。如果不显示,按以下顺序排查:先确认putString的 key 和getString的 key 一致;再确认接收端setText之前没有把 TextView 绑定错;最后确认清单里test_2已注册。

这里有一个容易混淆的点:setClass和构造函数new Intent(this, Class)效果一样,报告里两种写法都出现了,不是错误,只是风格差异。

4. UI 布局嵌套与对话框:LinearLayout、TableLayout、RelativeLayout 的实战拆解

4.1 布局嵌套的分析方法

实验三要求实现一个界面:最外层纵向 LinearLayout,里面依次是横向 LinearLayout(四列)、TableLayout(三行三列)、纵向 LinearLayout(四行)。这种嵌套结构在今天的 ConstraintLayout 时代看起来笨重,但它是理解 Android 布局权重和测量机制的最好素材。

分析布局时,我一般从外往里拆:先确定最外层方向,再确定每一块的高度和宽度策略,最后看layout_weight怎么分配剩余空间。报告里的横向 LinearLayout 用了layout_weight让四个 TextView 等分宽度,这是weight最典型的用法。

<!-- 横向四列,等分宽度 --> <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" /> <!-- green、blue 同理,weight 都为 1 --> </LinearLayout>

逻辑说明:layout_weight的作用是把父容器的剩余空间按权重分配。这里四个子 View 的layout_weight都是 1,所以等分。注意,layout_width设成wrap_content时,weight 分配的是“剩余空间”,如果设成0dp,weight 直接决定最终宽度,后者更符合现代写法。参数上,fill_parent和match_parent在旧版本里是同一个意思,新版本统一用match_parent。

4.2 TableLayout 的三行三列实现

TableLayout 的特点是行由<TableRow>定义,列数由最宽的行决定。报告里要求三行三列,常见做法是写三个 TableRow,每个里面放三个 TextView。如果某一行少放一个,表格会自动补空位,但不会报错,这是容易让人困惑的地方。

<TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow> <TextView android:text="1" /> <TextView android:text="2" /> <TextView android:text="3" /> </TableRow> <!-- 第二行、第三行同理 --> </TableLayout>

逻辑说明:TableRow 的宽度默认是match_parent,子 View 默认wrap_content。如果想让列等宽,需要给每个子 View 设layout_weight="1"并把宽度设成0dp。报告里没提这点,但实际做实验时如果列宽不齐,就是这里没设。

4.3 多输入框对话框与 Toast 输出

实验三第二部分要求用 LinearLayout 放两个 TextView 和两个 EditText,点击按钮后输出。报告里提到可以用 Toast、TextView 或 Logcat 输出。我一般用 Toast 做即时反馈,用 Logcat 做调试记录。

// 对话框按钮点击后的输出逻辑 Button okBtn = (Button) findViewById(R.id.ok); okBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { EditText input1 = (EditText) findViewById(R.id.input1); EditText input2 = (EditText) findViewById(R.id.input2); String text1 = input1.getText().toString(); String text2 = input2.getText().toString(); // Toast 即时显示 Toast.makeText(MainActivity.this, "输入1=" + text1 + ", 输入2=" + text2, Toast.LENGTH_SHORT).show(); // Logcat 记录,方便排查 Log.d("UI_DEMO", "input1=" + text1 + ", input2=" + text2); } });

逻辑说明:getText().toString()是取 EditText 内容的标准写法,直接getText()返回的是 Editable,不是 String。Toast.makeText的第三个参数是显示时长,LENGTH_SHORT和LENGTH_LONG是常量。Log.d的 tag 用统一前缀,方便在 Logcat 里过滤。参数上,如果 EditText 为空,toString()返回空字符串,不会崩,但业务上通常需要判空。

5. 避坑与排查:环境搭建和 Activity 传参中最容易翻车的五个点

5.1 现象:Eclipse 新建 Android 工程时报 “No Android SDK found”

原因:ADT 安装后没有在 Preference 里配置 SDK Location,或者路径填错。解决:打开Windows -> Preference -> Android,确认 SDK Location 指向 SDK 根目录,且该目录下有platforms和tools文件夹。如果路径正确仍报错,检查 SDK 是否解压完整。

5.2 现象:点击按钮跳转时应用直接崩溃,Logcat 报 ActivityNotFoundException

原因:目标 Activity 没有在AndroidManifest.xml里注册。解决:在<application>标签内添加<activity android:name=".second" />。注意类名前的点号不能丢,它表示相对于包名的路径。

5.3 现象:接收端取到的字符串是 null,TextView 显示空白

原因:发送端putString的 key 和接收端getString的 key 不一致,或者接收端getExtras()返回 null 后直接调用getString。解决:统一 key 命名,接收端先判空再取值。常见做法是把 key 定义成常量,两边引用同一个常量。

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

原因:layout_weight和layout_width配合不当,或者嵌套层级太深导致测量结果不符合预期。解决:把需要按比例分配的子 View 宽度设成0dp,只靠layout_weight控制。嵌套层级尽量控制在三层以内,超过三层考虑用 RelativeLayout 或 ConstraintLayout 扁平化。

5.5 现象:离线安装 SDK 后,SDK Manager 里看不到已安装的平台

原因:离线包解压位置不对,或者文件夹命名不符合 SDK Manager 的识别规则。解决:platforms下每个版本必须是独立子目录,目录名格式为android-<API级别>,比如android-8。tools包要解压覆盖到 SDK 根目录的tools文件夹,不能放在platforms下。

6. 从这份实验报告里能带走的进阶技巧:用日志和清单检查替代反复重装

这份报告最容易被低估的地方,是它把“验证”写进了每一步:JDK 要跑 test.java,Eclipse 要截图,SDK 要截图,ADT 要截图。很多人觉得截图是形式主义,但实际开发中,验证动作本身就是排查手段。我后来带新人时,强制要求每配完一个环境变量就跑一次java -version,每注册一个 Activity 就先在清单里搜一遍类名,每传一次 Intent 就先在发送端和接收端各打一条 Log。

具体做法是:在发送端startActivity之前打一条Log.d("INTENT_SEND", "key=name, value=" + value),在接收端getExtras之后打一条Log.d("INTENT_RECV", "bundle=" + tbd)。这样如果传参失败,Logcat 里能直接看到是发送端没放进去,还是接收端没取出来。这个习惯比反复重装 SDK 高效得多。

另一个技巧是清单文件检查。Android 的清单文件是应用的“黑匣子”入口,任何 Activity、Service、权限都要在这里声明。我一般会在项目根目录放一个检查清单,新建 Activity 后立刻做三件事:在清单里注册、在布局里加根节点、在 Java 里覆写onCreate。这三件事做完,基本不会出现“跳转崩溃”这类低级问题。

还有一个关于布局的教训:layout_weight不是万能药。它适合按比例分配空间,但不适合精确控制间距。如果实验里要求“四列等宽”,用 weight 没问题;如果要求“第一列固定 100dp,剩下三列等分”,就需要把第一列宽度写死,后三列用 weight。混用的时候,weight 计算的是剩余空间,不是总空间,这个区别在嵌套布局里会被放大。

从那以后我每次复现这类老实验报告,都强制走一遍“环境变量验证 → 清单注册检查 → Intent 日志双打 → 布局权重核算”这四步。看起来慢,但比装到一半发现 SDK 路径错了再重来快得多。希望帮到你。

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

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

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

立即咨询