资讯动态

Android Activity生命周期与Intent传参实战指南

发布时间:2026/10/27 11:46:17 来源:尧图企业网站定制
简介本资源是一份面向软件学院本科生的《移动应用软件开发技术》课程实验报告聚焦Android平台基础开发能力培养适用于移动应用开发入门学习与实践复盘。报告系统覆盖Android开发环境搭建JDK、Eclipse、SDK及ADT插件的安装、配置与验证、Activity生命周期管理与Intent跳转机制、以及UI设计核心实践TextView/Button/ImageView等组件与LinearLayout/RelativeLayout等布局器的应用内容紧扣教学大纲含详细操作步骤、截图要求与验证方法。资源为1个Word文档.doc格式完整记录4个核心实验全过程文件大小1.63MB结构清晰、图文指引明确便于对照实操与课后复习。目前已有767人学习下载是掌握Android开发入门流程、理解开发工具链协同关系、夯实Activity与UI双主线能力的实用型教学参考资料。1. 这份 Android 移动应用开发实验报告不是“过时的古董”而是能直接复用的毕设/课设骨架2013 年的实验报告别急着划走——它恰恰是当前高校移动应用开发类课程最真实、最可落地的“教学锚点”。我带过三届软件学院本科生的移动开发课设发现一个反直觉的事实学生翻车最多的从来不是 Kotlin 或 Jetpack Compose 的新语法而是 Activity 生命周期没理清、Intent 传参漏判空、XML 布局嵌套层级失控导致 UI 错位。这份报告里埋着的正是这些“血泪经验”的原始切片从 JDK 6 Eclipse ADT 的经典组合到startActivity()调用后onCreate()为何没触发、getExtras()返回 null 却不报错的玄学现场。它不教你怎么写高大上的跨平台框架而是手把手带你把“按钮点一下跳页面、带参数过去、再显示出来”这个闭环跑通。适合两类人一是正在赶 Android 课设 deadline 的本科生需要一份结构完整、代码可粘贴、截图有依据、答辩能讲清原理的交付物二是刚接手移动开发教学任务的青年教师想快速拆解出一套可分阶段验收的实验模块。它解决的不是“未来趋势”而是“今天下午三点前必须让模拟器跑起来”的刚需。2. 环境搭建不是照着官网点下一步而是理解每个环节的职责边界与失效点Android 开发环境搭建常被当成“安装教程”但实际交付中90% 的编译失败、AVD 启动黑屏、R 文件不生成问题都源于对各组件职责边界的模糊。这份报告虽基于旧工具链JDK 6 / Eclipse / ADT但其模块划分逻辑至今有效JDK 提供 Java 字节码运行时Eclipse 是 IDE 容器SDK 是 Android API 与工具集ADT 是连接 IDE 与 SDK 的协议翻译层。下面按真实调试顺序展开关键配置与验证点。2.1 JDK 6 环境变量JAVA_HOME 必须指向 JDK 根目录而非 JRE很多学生将JAVA_HOME设为C:\Program Files\Java\jre7导致javac命令不可用。正确路径应为 JDK 安装根目录如C:\Program Files\Java\jdk1.6.0_45。验证命令需在 CMD 中逐行执行# 检查 JAVA_HOME 是否生效 echo %JAVA_HOME% # 检查 java 和 javac 是否指向同一版本 java -version javac -version # 编译并运行测试文件注意test.java 必须含 public class echo public class test { public static void main(String[] args) { System.out.println(\JDK OK\); } } test.java javac test.java java test提示若javac报“不是内部或外部命令”说明PATH未包含%JAVA_HOME%\bin若java -version与javac -version版本号不一致说明系统 PATH 中存在其他 Java 路径干扰需清理。2.2 Eclipse 解压即用的本质workspace 与 plugin 目录分离设计Eclipse 不是传统安装程序其核心在于 workspace工作区与 installation安装目录物理隔离。这意味着同一 Eclipse 安装目录可被多个 workspace 复用如D:\eclipse\下建workspace_android和workspace_javaeeADT 插件安装后存于eclipse\plugins\子目录而非注册表若 Eclipse 启动报Plugin org.eclipse.core.runtime was unable to load...大概率是 workspace 元数据损坏不要重装 Eclipse只需新建 workspace 并重新导入项目。验证方式启动 Eclipse →File → Switch Workspace → Other...→ 新建路径如D:\workspace_android→ 重启后检查Window → Preferences → General → Workspace显示路径是否更新。2.3 SDK 离线安装platforms 与 tools 的版本耦合关系是黑匣子在线 SDK Manager 已淘汰但离线安装逻辑仍具指导意义。关键点在于tools如adb.exe,aapt.exe与platforms\android-XX如android-2.2必须版本兼容。例如tools_r06仅支持android-1.5至android-2.2若强行放入android-4.0平台aapt会报Invalid resource directory name。离线安装步骤需严格遵循解压android-sdk_r16-windows.zip到固定路径如D:\android-sdk手动创建必需空目录platforms,platform-tools,tools,add-ons,samples,docs下载指定 URL 的 ZIP 包如android-2.2_r01-windows.zip解压时必须保留 ZIP 内原始目录结构即解压后得到android-2.2文件夹再将其整体移入D:\android-sdk\platforms\将tools_r06-windows.zip解压内容覆盖至D:\android-sdk\tools\。验证命令# 进入 SDK tools 目录 cd /d D:\android-sdk\tools # 检查 adb 是否识别设备需先开 AVD 或连真机 adb version adb devices # 检查 aapt 是否能解析 layout XML取任意 activity_main.xml 测试 aapt dump badging D:\workspace\MyApp\res\layout\activity_main.xml 2nul echo aapt OK || echo aapt broken2.4 ADT 插件安装URI 协议与证书信任的隐性依赖http://dl-ssl.google.com/android/eclipse/这个 URI 看似普通实则暗含两个关键约束dl-ssl表示强制 HTTPS若本地网络拦截 SSL 证书如企业防火墙Eclipse 会静默失败界面无报错eclipse/路径下必须存在content.jar和artifacts.jar否则插件列表为空。绕过方案当网络受限时从可信镜像站下载adt-bundle-windows-x86_64-2013xxxx.zip含预装 ADT 的 Eclipse或手动下载ADT-23.0.7.zip解压后将features/与plugins/目录内容复制到 Eclipse 对应目录再通过Help → Install New Software → Add → Local加载本地路径。验证成功标志重启 Eclipse 后菜单栏出现Window → Android SDK Manager和Window → AVD Manager且Project → Properties → Android可选中已安装的 Target Platform。3. Activity 实战从生命周期切入把 Intent 传参做成可验证的确定性流程Activity 不是“页面”而是具备明确状态机的组件。实验二的两段代码看似简单却暴露了学生对onCreate()触发时机、Intent数据载体本质、Bundle序列化边界的普遍误解。我们以TestActivity02为例重构为可调试、可断点、可验证的工程实践。3.1 MainActivity 启动逻辑显式 Intent 的构造必须绑定目标 Activity 类名原代码中testintent.setClass(TextMainActivity.this,test_2.class)是正确写法但易被误写为setClassName()或setAction()。关键区别在于setClass(Context, Class)直接指定目标 Activity 类适用于同一应用内跳转setClassName(String, String)需传入包名类名字符串易因拼写错误崩溃setAction(String)用于隐式 Intent需在AndroidManifest.xml中声明intent-filter。加固写法增加空指针防护与日志// TextMainActivity.java y.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { // 1. 构造 Bundle 并校验数据 Bundle bundle new Bundle(); String data 中国; if (data ! null !data.trim().isEmpty()) { bundle.putString(name, data); } else { Log.w(MainActivity, Attempted to pass null/empty data); return; } // 2. 构造 Intent 并显式指定目标类 Intent intent new Intent(TextMainActivity.this, test_2.class); intent.putExtras(bundle); // 3. 添加调试标记便于 Logcat 过滤 intent.putExtra(debug_source, TextMainActivity); // 4. 启动并检查是否成功 try { startActivity(intent); Log.d(MainActivity, Intent sent to test_2 successfully); } catch (ActivityNotFoundException e) { Log.e(MainActivity, Target Activity not found: e.getMessage()); Toast.makeText(TextMainActivity.this, 目标页面未找到, Toast.LENGTH_SHORT).show(); } } });3.2 test_2 接收逻辑Bundle 解包必须前置非空判断避免 Crash原代码Bundle tbd this.getIntent().getExtras();未校验getIntent()和getExtras()返回值一旦startActivity()被异常中断如内存不足杀进程tbd为 null后续tbd.getString(name)直接抛NullPointerException。标准防御式写法// test_2.java Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); TextView test (TextView) findViewById(R.id.ruirui); // 1. 获取 Intent 并校验 Intent intent getIntent(); if (intent null) { Log.e(test_2, Received null Intent); test.setText(Error: Null Intent); return; } // 2. 获取 Bundle 并校验 Bundle extras intent.getExtras(); if (extras null) { Log.w(test_2, Intent has no extras); test.setText(No data received); return; } // 3. 安全提取字符串提供默认值 String name extras.getString(name, Default Name); if (name null) { Log.w(test_2, Key name exists but value is null); name Null Value; } test.setText(name); Log.d(test_2, Displaying name: name); }3.3 生命周期可视化用 Logcat 验证 Activity 状态流转仅靠界面截图无法证明onCreate()正常执行。必须在Logcat中观察生命周期方法调用序列。在test_2中添加完整生命周期日志// test_2.java补充 Override protected void onStart() { super.onStart(); Log.d(test_2, onStart called); } Override protected void onResume() { super.onResume(); Log.d(test_2, onResume called); } Override protected void onPause() { super.onPause(); Log.d(test_2, onPause called); } Override protected void onStop() { super.onStop(); Log.d(test_2, onStop called); } Override protected void onDestroy() { super.onDestroy(); Log.d(test_2, onDestroy called); }预期 Logcat 输出过滤test_2D/test_2: onCreate called D/test_2: onStart called D/test_2: onResume called若只看到onCreate无后续说明 Activity 被异常终止如AndroidManifest.xml中未声明该 Activity若返回时无onPause/onStop说明用户未真正离开页面如弹出 Dialog。3.4 AndroidManifest.xml 的隐性约束Activity 声明缺失是静默失败主因学生常忽略AndroidManifest.xml中 Activity 的activity声明。即使 Java 类和 Layout 存在未声明则startActivity()会抛ActivityNotFoundException。正确声明格式!-- AndroidManifest.xml -- application android:allowBackuptrue android:icondrawable/ic_launcher android:labelstring/app_name !-- 主 Activity 必须含 LAUNCHER -- activity android:name.TextMainActivity android:labelstring/app_name intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity !-- 被启动的 Activity 必须声明但无需 intent-filter -- activity android:name.test_2 android:labelSecond Activity / /application注意android:name值必须与 Java 类名完全匹配包括大小写.test_2表示com.example.test.test_2包名前缀由manifest packagecom.example.test定义。4. UI 设计实战用 LinearLayout 嵌套规则破解“布局错乱”的玄学问题实验三的 UI 设计看似是拖控件实则是理解 Android 布局引擎计算逻辑的入口。图 3.1 的三层嵌套Vertical LinearLayout → Horizontal LinearLayout → TableLayout暴露出学生对layout_weight、layout_height、gravity三者作用域的混淆。我们以“四色块横向布局”为例给出可复现的 XML 结构与调试方法。4.1 四色块布局weight 分配必须配合 0dp 高度/宽度原 XML 中TextView android:layout_widthwrap_content android:layout_heightfill_parent android:layout_weight1 /存在致命错误fill_parent已废弃应为match_parent且当使用layout_weight时对应方向尺寸必须设为0dp。否则 weight 计算失效导致色块宽度不均。修正后的 activity_main.xml?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical !-- 外层 Vertical LinearLayout占满屏幕 -- LinearLayout android:layout_widthmatch_parent android:layout_height0dp android:layout_weight2 !-- 占垂直空间 2 份 -- android:orientationhorizontal !-- 四个色块每个 width0dp weight1均分水平空间 -- TextView android:layout_width0dp android:layout_heightmatch_parent android:layout_weight1 android:gravitycenter android:background#CE0000 android:textred / TextView android:layout_width0dp android:layout_heightmatch_parent android:layout_weight1 android:gravitycenter android:background#00A600 android:textgreen / TextView android:layout_width0dp android:layout_heightmatch_parent android:layout_weight1 android:gravitycenter android:background#0000CE android:textblue / TextView android:layout_width0dp android:layout_heightmatch_parent android:layout_weight1 android:gravitycenter android:background#CECE00 android:textyellow / /LinearLayout !-- TableLayout占垂直空间 1 份 -- TableLayout android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:stretchColumns* TableRow TextView android:textRow1-Col1 / TextView android:textRow1-Col2 / TextView android:textRow1-Col3 / /TableRow TableRow TextView android:textRow2-Col1 / TextView android:textRow2-Col2 / TextView android:textRow2-Col3 / /TableRow TableRow TextView android:textRow3-Col1 / TextView android:textRow3-Col2 / TextView android:textRow3-Col3 / /TableRow /TableLayout !-- 底部 Vertical LinearLayout占垂直空间 1 份 -- LinearLayout android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:orientationvertical TextView android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:background#FF6B6B android:textLine1 / TextView android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:background#4ECDC4 android:textLine2 / TextView android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:background#FFBE0B android:textLine3 / TextView android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1 android:gravitycenter android:background#FB5607 android:textLine4 / /LinearLayout /LinearLayout4.2 多输入对话框EditText 输入验证与 Toast 输出的原子性保障图 3.2 要求“点击按钮后输出”但原描述未明确输出位置。实践中需同时满足Toast显示用户可见反馈TextView更新界面状态Logcat记录结构化日志供调试。activity_text_main.xml精简版LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical android:padding16dp TextView android:layout_widthwrap_content android:layout_heightwrap_content android:text用户名 / EditText android:idid/edit_username android:layout_widthmatch_parent android:layout_heightwrap_content android:hint请输入用户名 / TextView android:layout_widthwrap_content android:layout_heightwrap_content android:text密码 / EditText android:idid/edit_password android:layout_widthmatch_parent android:layout_heightwrap_content android:inputTypetextPassword android:hint请输入密码 / Button android:idid/btn_submit android:layout_widthmatch_parent android:layout_heightwrap_content android:text提交 / TextView android:idid/tv_result android:layout_widthmatch_parent android:layout_heightwrap_content android:layout_marginTop16dp android:text结果将显示在此处 / /LinearLayoutTextMainActivity.java关键逻辑// TextMainActivity.java续 private EditText editUsername; private EditText editPassword; private TextView tvResult; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_main); editUsername (EditText) findViewById(R.id.edit_username); editPassword (EditText) findViewById(R.id.edit_password); tvResult (TextView) findViewById(R.id.tv_result); Button btnSubmit (Button) findViewById(R.id.btn_submit); btnSubmit.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { // 1. 获取输入并校验空值、长度 String username editUsername.getText().toString().trim(); String password editPassword.getText().toString().trim(); if (username.isEmpty() || password.isEmpty()) { Toast.makeText(TextMainActivity.this, 用户名和密码不能为空, Toast.LENGTH_SHORT).show(); return; } if (username.length() 3 || password.length() 6) { Toast.makeText(TextMainActivity.this, 用户名至少3位密码至少6位, Toast.LENGTH_SHORT).show(); return; } // 2. 组装输出字符串 String result String.format(提交成功用户名%s密码长度%d, username, password.length()); // 3. 三端同步输出 tvResult.setText(result); Toast.makeText(TextMainActivity.this, result, Toast.LENGTH_LONG).show(); Log.i(TextMainActivity, Form submitted: result); } }); }4.3 RelativeLayout 与 LinearLayout 的选择哲学何时用哪个学生常问“为什么不用 RelativeLayout 替代所有 LinearLayout”答案在于性能与可维护性权衡LinearLayout适合线性排列单行/单列weight分配直观嵌套过深3 层时渲染性能下降RelativeLayout适合相对定位如“按钮在文本框右侧”减少嵌套层级但属性间存在隐式依赖如android:layout_toRightOf需要被参照 View 已定义调试困难最佳实践外层用LinearLayout划分大区块Header/Content/Footer区块内用RelativeLayout精确定位控件。图 3.1 的三层结构正是此思想的体现。5. 常见问题排查Activity 启动失败、UI 错位、R 文件不生成的 5 个硬核解法这份实验报告交付过程中我见过太多学生卡在同一个地方反复折腾。以下是五个最高频、最易被忽略的“翻车点”按现象→原因→解决三步法给出可立即执行的方案。5.1 现象点击按钮无反应Logcat 无任何日志onClick()方法未进入原因Button的OnClickListener未正确绑定或findViewById()返回 nullID 名与 XML 不匹配解决在onCreate()中findViewById()后立即加空指针判断Button b (Button) findViewById(R.id.button1); if (b null) { Log.e(MainActivity, Button with id button1 not found in layout); return; } b.setOnClickListener(...);检查activity_main.xml中Button的android:id是否为id/button1表示创建新 ID漏写则引用不存在的 ID清理项目Project → Clean → Clean all projects强制重建 R.java。5.2 现象Activity 跳转后黑屏或闪退Logcat 报ClassNotFoundException原因AndroidManifest.xml中未声明目标 Activity或android:name拼写错误大小写敏感解决打开AndroidManifest.xml确认activity android:name.test_2存在检查test_2.java的包声明如package com.example.test;与android:name前缀是否一致.test_2表示com.example.test.test_2在Logcat中过滤AndroidRuntime查看完整异常栈定位具体类名。5.3 现象XML 布局中TextView文字不显示或背景色无效原因android:text值为string/my_activity但res/values/strings.xml中未定义该 string解决打开strings.xml添加string namemy_activitymy_activity/string若使用硬编码文字如android:textmy_activity确保无中文全角符号如引号、空格检查TextView的android:layout_height是否为0dp且未设weight导致高度为 0。5.4 现象R.java文件不生成R.id.button1报红原因XML 文件存在语法错误如未闭合标签、非法字符或资源文件名含大写字母/特殊符号解决查看Problems视图定位具体 XML 错误行检查res/下所有文件名只能小写字母、数字、下划线如activity_main.xml✅ActivityMain.xml❌删除gen/目录Eclipse 自动重建或Project → Build Automatically开启自动构建。5.5 现象AVD 启动缓慢或模拟器窗口空白原因SDK Tools 版本与 AVD 系统镜像不兼容或宿主机未开启硬件加速Intel HAXM / AMD Hypervisor解决在SDK Manager中确保Tools → Android SDK Tools与System Images → Android 2.2 (API 8)同期下载r16 对应 2.2检查 BIOS 中 Virtualization Technology (VT-x) 是否启用手动安装 HAXM下载intelhaxm-android.exe运行安装重启电脑。6. 验收与答辩用三张表、一次真机测试、一个调试习惯拿下满分交报告不等于完成验收和答辩才是检验你是否真正吃透这套方案的关键。我带过的某高校软件学院课程最终成绩 40% 来自实验报告文档60% 来自现场演示与问答。以下是我总结的“三张表一次测试一个习惯”通关法助你避开答辩雷区。6.1 验收三张表让老师一眼看懂你的工作量与思考深度很多学生只交代码和截图老师无法快速评估工作质量。我要求学生必须附上三张结构化表格它们不是形式主义而是你技术思维的具象化。表 1环境配置验证清单自证搭建成功检查项验证命令/操作预期输出实际截图页码是否通过JDK 安装java -versionjavac -version显示 1.6.xP3✓Eclipse ADTWindow → Android SDK Manager可打开显示已安装 platformsP5✓SDK ToolsD:\android-sdk\tools\adb version显示 r16P7✓AVD 运行启动名为Android_2.2的 AVD模拟器显示 Android 启动动画P9✓设计说明这张表强迫你把“安装完成”转化为可验证的动作。老师只需扫一眼“是否通过”列就能确认环境真实性避免“截图是网上找的”质疑。表 2Activity 通信测试用例表证明 Intent 逻辑健壮测试场景操作步骤预期结果实际结果Logcat 关键日志过滤 test_2是否通过正常传参MainActivity 点按钮test_2 显示“中国”显示“中国”D/test_2: Displaying name: 中国✓空字符串修改 MainActivity 传test_2 显示“Default Name”显示“Default Name”D/test_2: Displaying name: Default Name✓null 参数注释bundle.putString()行test_2 显示“No data received”显示“No data received”W/test_2: Intent has no extras✓设计说明这张表把“功能实现”升级为“质量保障”。它证明你不仅会写代码更懂如何设计边界测试。答辩时老师若问“如果用户不输内容怎么办”你可直接指向此表第三行。表 3UI 布局响应性测试表验证适配能力设备类型模拟器配置截图关键特征是否符合设计图 3.1备注HVGA (320x480)AVD: Android 2.2, HVGA四色块等宽TableLayout 三行三列清晰✓无截断WVGA800 (480x800)AVD: Android 2.2, WVGA800底部四行 TextView 高度均等✓无重叠平板 (1024x600)AVD: Android 2.2, WXGA外层 Vertical LinearLayout 占满屏幕✓无留白设计说明移动端核心是适配。此表用不同分辨率验证layout_weight和match_parent的实际效果比单纯说“我用了相对布局”有力得多。6.2 一次真机测试用手机拍视频比截图更有说服力截图可以伪造但真机操作视频无法。我要求学生必须用手机录制一段 60 秒内的操作视频前 10 秒展示手机型号如“HTC Desire Z, Android 2.2”中间 30 秒从 MainActivity 点击按钮 → 进入 test_2 页面 → 返回 → 再次点击 → 输入“中国” → 显示正确后 20 秒横竖屏切换展示 UI 自适应若布局支持。视频命名规范学号_姓名_ActivityTest.mp4如2013001_张三_ActivityTest.mp4。交付方式将视频上传至云盘报告末尾附链接设置为“任何人可查看”。为什么有效视频包含时间戳、设备信息、操作连贯性彻底杜绝“P 图造假”嫌疑。某次答辩中一位同学因视频里 AVD 启动时间长达 90 秒被老师追问优化方案反而展示了他对emulator -accel on命令的掌握拿了加分。6.3 一个调试习惯Logcat 过滤器必须带模块标签学生常犯的错误是Log.d(msg, ...)导致 Logcat 信息淹没。我的铁律是所有 Log 必须用类名或模块名作为 tag且在 Logcat 视图中创建永久过滤器。操作步骤在 Eclipse 中打开Logcat视图点击右上角按钮 →Filter SettingsFilter Name 填MainActivityby Log Tag 填MainActivity同样创建test_2、UI_Test过滤器。答辩话术“老师我所有的调试都基于 Logcat 过滤。比如您想看 Activity 跳转过程只需点这个test_2过滤器就能看到完整的onCreate→onStart→onResume日志链以及传入的数据值。这比截图更能证明逻辑正确性。”从那以后我每次带新学生做移动开发实验都强制他们在第一天就配置好这三个过滤器并把Log.d(TAG, ...)写进所有 Activity 的onCreate()。因为真正的工程能力不在于写出能跑的代码而在于写出可验证、可追溯、可解释的代码。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑