Interview AiBox logo

Interview AiBox 实时 AI 助手,让你自信应答每一场面试

download免费下载
基础local_fire_department13 次面试更新于 2025-09-05account_tree思维导图

当从Activity A启动Activity B时,两个Activity的生命周期会如何变化?

lightbulb

题型摘要

当从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的生命周期变化

  1. onPause(): 当Activity B启动时,Activity A首先会调用onPause()方法

    • 此时Activity A仍然部分可见,但已失去焦点
    • 在此方法中应保存轻量级状态和停止动画等
  2. onStop(): 当Activity B完全显示并覆盖Activity A时,Activity A会调用onStop()方法

    • 此时Activity A完全不可见
    • 在此方法中应释放不需要的资源

Activity B的生命周期变化

  1. onCreate(): Activity B首次创建

    • 初始化UI组件和数据
    • 设置布局和视图
  2. onStart(): Activity B即将对用户可见

    • 准备Activity显示所需资源
  3. onResume(): Activity B获得焦点,可以与用户交互

    • 此时Activity B位于前台,可以接收用户输入
--- title: Activity A启动Activity B的生命周期变化 --- sequenceDiagram participant Activity A participant Activity B participant System Note over Activity A, System: 启动Activity B Activity A->>System: startActivity(B) System->>Activity A: onPause() System->>Activity B: onCreate() System->>Activity B: onStart() System->>Activity B: onResume() Note over Activity B: Activity B完全可见并获取焦点 System->>Activity A: onStop() Note over Activity A: Activity A不可见但未销毁

从Activity B返回Activity A时的生命周期变化

当用户从Activity B返回Activity A时(例如按返回键):

Activity B的生命周期变化

  1. onPause(): Activity B即将失去焦点
  2. onStop(): Activity B不再对用户可见
  3. onDestroy(): Activity B被销毁(如果系统需要回收资源)

Activity A的生命周期变化

  1. onRestart(): Activity A即将重新启动
  2. onStart(): Activity A即将对用户可见
  3. onResume(): Activity A获得焦点,可以与用户交互
--- title: 从Activity B返回Activity A时的生命周期变化 --- sequenceDiagram participant Activity B participant Activity A participant System Note over Activity B, System: 用户按返回键 Activity B->>System: onBackPressed() System->>Activity B: onPause() System->>Activity B: onStop() System->>Activity B: onDestroy() System->>Activity A: onRestart() System->>Activity A: onStart() System->>Activity A: onResume() Note over Activity A: 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时,生命周期变化遵循以下顺序:

  1. Activity A调用onPause()
  2. Activity B依次调用onCreate()onStart()onResume()
  3. Activity A调用onStop()

这种生命周期变化确保了Activity之间的平滑切换和资源管理。理解Activity生命周期对于开发稳定、高效的Android应用至关重要,它帮助开发者正确管理应用状态、资源释放和用户体验。

参考资料

account_tree

思维导图

Interview AiBox logo

Interview 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之间的平滑切换和资源管理。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请解释Android中的事件分发机制。

Android事件分发机制是处理用户触摸事件的核心机制,涉及三个关键方法:dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截,仅ViewGroup拥有)和onTouchEvent(事件处理)。事件从Activity开始,经过View树自顶向下传递,若未被消费则自底向上回溯。理解这一机制对解决滑动冲突、自定义手势等复杂UI交互问题至关重要。

arrow_forward

你有自定义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原理能帮助开发者创建更灵活丰富的用户界面。

arrow_forward

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开发中的状态管理、资源处理和用户体验优化至关重要。

arrow_forward

请详细描述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()方法来实现自定义逻辑。

arrow_forward

请解释Android中的跨进程通信机制。

Android中的跨进程通信(IPC)机制包括:Binder(核心机制)、Intent、Bundle、ContentProvider、Messenger、AIDL、文件共享和Socket。Binder是Android系统大部分IPC方式的基础,具有高性能、高安全性、稳定性和面向对象的特点。不同IPC机制在性能、复杂度、数据传输方式和适用场景上各有不同,应根据数据量大小、实时性要求、并发需求、实现复杂度、安全性和性能要求等因素选择合适的IPC方式。

arrow_forward

阅读状态

阅读时长

5 分钟

阅读进度

5%

章节:19 · 已读:0

当前章节: 基本Activity生命周期方法

最近更新:2025-09-05

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

面试中屏幕实时显示参考回答,帮你打磨表达。

免费下载download

分享题目

复制链接,或一键分享到常用平台

外部分享