Interview AiBoxInterview AiBox 实时 AI 助手,让你自信应答每一场面试
当从Activity A启动Activity B时,两个Activity的生命周期会如何变化?
题型摘要
当从Activity A启动Activity B时,Activity A先调用onPause(),然后Activity B依次调用onCreate()、onStart()和onResume(),最后Activity A调用onStop()。返回时,Activity B先调用onPause()和onStop(),Activity A则依次调用onRestart()、onStart()和onResume(),最后Activity B调用onDestroy()。这种生命周期变化确保了Activity之间的平滑切换和资源管理。
Activity A启动Activity B时的生命周期变化
基本Activity生命周期方法
在分析Activity A启动Activity B的生命周期变化之前,我们需要先了解Android中Activity的基本生命周期方法:
- onCreate(): Activity首次创建时调用,用于初始化UI和数据
- onStart(): Activity即将对用户可见时调用
- onResume(): Activity即将开始与用户交互时调用,此时Activity位于栈顶
- onPause(): Activity即将失去焦点时调用,通常用于保存数据和状态
- onStop(): Activity不再对用户可见时调用
- onDestroy(): Activity即将被销毁时调用,用于释放所有资源
- onRestart(): 停止的Activity即将重新启动时调用
从Activity A启动Activity B时的生命周期变化
当从Activity A启动Activity B时,两个Activity的生命周期变化遵循以下顺序:
Activity A的生命周期变化
-
onPause(): 当Activity B启动时,Activity A首先会调用onPause()方法
- 此时Activity A仍然部分可见,但已失去焦点
- 在此方法中应保存轻量级状态和停止动画等
-
onStop(): 当Activity B完全显示并覆盖Activity A时,Activity A会调用onStop()方法
- 此时Activity A完全不可见
- 在此方法中应释放不需要的资源
Activity B的生命周期变化
-
onCreate(): Activity B首次创建
- 初始化UI组件和数据
- 设置布局和视图
-
onStart(): Activity B即将对用户可见
- 准备Activity显示所需资源
-
onResume(): Activity B获得焦点,可以与用户交互
- 此时Activity B位于前台,可以接收用户输入
从Activity B返回Activity A时的生命周期变化
当用户从Activity B返回Activity A时(例如按返回键):
Activity B的生命周期变化
- onPause(): Activity B即将失去焦点
- onStop(): Activity B不再对用户可见
- onDestroy(): Activity B被销毁(如果系统需要回收资源)
Activity A的生命周期变化
- onRestart(): Activity A即将重新启动
- onStart(): Activity A即将对用户可见
- onResume(): Activity A获得焦点,可以与用户交互
特殊情况和注意事项
透明或对话框主题的Activity
- 如果Activity B是透明的或使用对话框主题,Activity A可能只会调用onPause()而不会调用onStop(),因为它仍然部分可见
- 这种情况下,Activity A仍然可见但不在前台
配置变更
- 如果在启动Activity B过程中发生配置变更(如屏幕旋转),可能会导致Activity A被销毁并重新创建
- 系统会先销毁Activity A,然后重新创建它,再启动Activity B
内存不足
- 在内存不足的情况下,系统可能会在Activity B启动后立即销毁Activity A,而不仅仅是停止它
- 这种情况下,当用户从Activity B返回时,系统需要重新创建Activity A
生命周期回调中的操作限制
- **onPause()**中不能执行耗时操作,因为它会阻塞Activity B的显示
- **onStop()**中不能执行UI操作,因为Activity已经不可见
- **onResume()**中应避免执行耗时操作,以保持UI响应性
实际应用中的最佳实践
在onPause()中
- 保存轻量级状态,如用户在表单中输入的内容
- 停止动画和视频播放
- 注销广播接收器
- 避免执行耗时操作,因为此方法必须快速完成
在onStop()中
- 释放不需要的资源,如摄像头、传感器等
- 保存更复杂的状态数据
- 执行较重的清理操作
在onSaveInstanceState()中
- 保存临时UI状态,如滚动位置、用户输入等
- 这些数据会在Activity重建时自动恢复
代码示例
// ActivityA.java
public class ActivityA extends AppCompatActivity {
private static final String TAG = "ActivityA";
private EditText userInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Log.d(TAG, "onCreate");
userInput = findViewById(R.id.user_input);
Button button = findViewById(R.id.button_start_b);
button.setOnClickListener(v -> {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
// 保存轻量级状态
saveLightweightState();
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
// 释放资源
releaseResources();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
// 保存临时状态
outState.putString("user_input", userInput.getText().toString());
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢复临时状态
userInput.setText(savedInstanceState.getString("user_input"));
}
private void saveLightweightState() {
// 保存用户输入等轻量级状态
}
private void releaseResources() {
// 释放摄像头、传感器等资源
}
}
总结
当从Activity A启动Activity B时,生命周期变化遵循以下顺序:
- Activity A调用onPause()
- Activity B依次调用onCreate()、onStart()和onResume()
- Activity A调用onStop()
这种生命周期变化确保了Activity之间的平滑切换和资源管理。理解Activity生命周期对于开发稳定、高效的Android应用至关重要,它帮助开发者正确管理应用状态、资源释放和用户体验。
参考资料
思维导图
Interview AiBoxInterview AiBox — 面试搭档
不只是准备,更是实时陪练
Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。
AI 助读
一键发送到常用 AI
当从Activity A启动Activity B时,Activity A先调用onPause(),然后Activity B依次调用onCreate()、onStart()和onResume(),最后Activity A调用onStop()。返回时,Activity B先调用onPause()和onStop(),Activity A则依次调用onRestart()、onStart()和onResume(),最后Activity B调用onDestroy()。这种生命周期变化确保了Activity之间的平滑切换和资源管理。
智能总结
深度解读
考点定位
思路启发
相关题目
请做一个自我介绍
自我介绍是HR面试的开场问题,考察表达能力、逻辑思维、自我认知、岗位匹配度和沟通技巧。有效的自我介绍应包含基本信息、教育背景、专业技能、项目/实习经历、个人特质与岗位匹配、求职动机与未来规划。表达时应控制时间在2-3分钟,语言简洁,重点突出,真诚自然。针对客户端开发岗位,应强调相关技术栈、项目经验和注重细节的特质。避免内容过于简单或冗长,缺乏针对性,过度夸大或缺乏逻辑性。建议提前准备、反复练习、突出亮点、保持真实并积极互动。
你的期望薪资是多少?
回答"期望薪资"问题需先做市场调研和自我评估,面试时应表达对职位的兴趣,提供合理薪资范围而非具体数字,强调综合考量整体薪酬包和发展机会,保持灵活态度并适时反问公司预算。避免过低或过高报价,关注长远职业发展。
请做一个自我介绍,包括你的教育背景、技术栈和项目经验。
自我介绍应包含教育背景、技术栈和项目经验三部分。首先简述基本信息,然后详细介绍与岗位相关的教育经历,清晰列出掌握的技术及熟练程度,选择2-3个代表性项目按STAR法则描述。最后强调个人优势与职业规划,表达对公司的向往。整个介绍应控制在3-5分钟,保持真实、有针对性,自信表达,并准备好对介绍内容的深入回答。
请详细介绍你的项目背景、技术选型、实现难点以及你的具体贡献。
这个问题要求面试者介绍项目背景、技术选型、实现难点和个人贡献。回答时应简明扼要地介绍项目目标和规模,详细说明技术选型理由,分析遇到的技术难点及解决方案,并清晰阐述个人在项目中的角色和贡献。通过展示项目经验、技术决策能力、问题解决能力和团队协作能力,全面体现面试者的综合素质和专业水平。
你在大学期间哪门计算机课程学得最好?为什么?
在大学期间,我学得最好的课程是数据结构与算法。通过理论与实践结合的学习方法,我深入掌握了各种数据结构和算法的核心知识点,并将这些知识应用到多个实际项目中。这些知识对客户端开发尤为重要,可以帮助优化性能、提升用户体验、有效管理内存和优化界面渲染。我持续学习算法的热情和扎实的基础,将帮助我在客户端开发实习中做出贡献。