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之间的平滑切换和资源管理。
智能总结
深度解读
考点定位
思路启发
相关题目
请解释Android中的事件分发机制。
Android事件分发机制是处理用户触摸事件的核心机制,涉及三个关键方法:dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截,仅ViewGroup拥有)和onTouchEvent(事件处理)。事件从Activity开始,经过View树自顶向下传递,若未被消费则自底向上回溯。理解这一机制对解决滑动冲突、自定义手势等复杂UI交互问题至关重要。
你有自定义View的经验吗?自定义View需要实现哪些方法?View的绘制流程中各个方法分别负责什么?
自定义View是Android开发中的重要技能,用于创建独特的UI组件。需要实现的关键方法包括构造函数、onMeasure()、onSizeChanged()、onLayout()和onDraw()等。View的绘制流程分为三个阶段:测量(measure)、布局(layout)和绘制(draw)。measure阶段通过measure()和onMeasure()确定View大小;layout阶段通过layout()和onLayout()确定View位置;draw阶段通过draw()、onDraw()和dispatchDraw()绘制View内容。掌握自定义View原理能帮助开发者创建更灵活丰富的用户界面。
Activity A打开ActivityB,A和B的生命周期怎样变化?
当Activity A启动Activity B时,生命周期变化顺序为:A的onPause() → B的onCreate() → B的onStart() → B的onResume() → A的onStop()(标准情况)。如果B是透明或对话框样式,A的onStop()不会被调用。返回时,B的onPause() → A的onRestart() → A的onStart() → A的onResume() → B的onStop() → B的onDestroy()。理解这一流程对Android开发中的状态管理、资源处理和用户体验优化至关重要。
请详细描述Android中View的绘制流程
Android View的绘制流程主要包括三个阶段:测量(measure)、布局(layout)和绘制(draw)。测量阶段通过MeasureSpec确定View的尺寸,由measure()和onMeasure()方法完成;布局阶段确定View的位置,由layout()和onLayout()方法完成;绘制阶段将View绘制到屏幕上,由draw()、onDraw()和dispatchDraw()方法完成。绘制流程通常由Activity启动、View树变化或手动请求(invalidate()、requestLayout())触发。优化绘制性能的方法包括使用硬件加速、减少过度绘制和使用ViewStub等。自定义View时需要重写onMeasure()、onLayout()和onDraw()方法来实现自定义逻辑。
请解释Android中的跨进程通信机制。
Android中的跨进程通信(IPC)机制包括:Binder(核心机制)、Intent、Bundle、ContentProvider、Messenger、AIDL、文件共享和Socket。Binder是Android系统大部分IPC方式的基础,具有高性能、高安全性、稳定性和面向对象的特点。不同IPC机制在性能、复杂度、数据传输方式和适用场景上各有不同,应根据数据量大小、实时性要求、并发需求、实现复杂度、安全性和性能要求等因素选择合适的IPC方式。