Android面试题库
Android基础
Activity

Activity

概述

Activity是Android应用程序的基本组件之一,它提供了一个用户界面,用户可以与之交互。了解Activity的生命周期、启动模式和任务栈对于开发高质量的Android应用至关重要。

生命周期

1. 基本生命周期方法

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化Activity
    }
 
    override fun onStart() {
        super.onStart()
        // Activity变为可见
    }
 
    override fun onResume() {
        super.onResume()
        // Activity获取焦点,可与用户交互
    }
 
    override fun onPause() {
        super.onPause()
        // Activity失去焦点,但仍可见
    }
 
    override fun onStop() {
        super.onStop()
        // Activity完全不可见
    }
 
    override fun onDestroy() {
        super.onDestroy()
        // Activity被销毁
    }
 
    override fun onRestart() {
        super.onRestart()
        // Activity从停止状态重新启动
    }
}

2. 生命周期状态

  1. Created:Activity已创建但未显示
  2. Started:Activity可见但无法交互
  3. Resumed:Activity可见且可交互
  4. Paused:Activity部分可见但无法交互
  5. Stopped:Activity完全不可见
  6. Destroyed:Activity被销毁

启动模式

1. standard

  • 默认启动模式
  • 每次启动都创建新实例
  • 可以多次创建同一Activity

2. singleTop

  • 栈顶复用模式
  • 如果目标Activity在栈顶,则复用
  • 否则创建新实例

3. singleTask

  • 栈内复用模式
  • 在目标任务栈中只有一个实例
  • 会清除其上的所有Activity

4. singleInstance

  • 单实例模式
  • 独占一个任务栈
  • 系统中只有一个实例

任务栈(Task Stack)

1. 基本概念

  • 任务栈遵循后进先出(LIFO)原则
  • 每个任务栈包含一系列Activity
  • Activity的启动模式影响任务栈行为

2. 管理方式

<!-- AndroidManifest.xml -->
<activity
    android:name=".MainActivity"
    android:taskAffinity="com.example.task"
    android:launchMode="standard" />

状态保存与恢复

1. 保存状态

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("key", "value")
}

2. 恢复状态

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    savedInstanceState?.getString("key")
}

面试常见问题

1. Activity生命周期的完整流程是什么?

  1. 完整流程

    • onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()
    • 从后台恢复:onRestart() → onStart() → onResume()
  2. 典型场景

    • 启动Activity:onCreate() → onStart() → onResume()
    • 按Home键:onPause() → onStop()
    • 返回应用:onRestart() → onStart() → onResume()
    • 按返回键:onPause() → onStop() → onDestroy()

2. onStart和onResume的区别?

  1. onStart

    • Activity变为可见
    • 但用户还不能与之交互
    • 适合恢复UI状态
  2. onResume

    • Activity获取焦点
    • 用户可以交互
    • 适合启动动画等

3. 横竖屏切换时Activity的生命周期?

  1. 默认情况

    • 销毁重建:onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
  2. 配置处理

<!-- AndroidManifest.xml -->
<activity
    android:configChanges="orientation|screenSize"
    android:name=".MainActivity" />

4. Activity的启动模式有什么区别?

  1. standard vs singleTop

    • standard总是创建新实例
    • singleTop在栈顶时复用
  2. singleTask vs singleInstance

    • singleTask允许其他Activity在同一栈
    • singleInstance独占一个任务栈

5. 如何避免Activity重建时丢失数据?

  1. 使用ViewModel
class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data
}
  1. 使用onSaveInstanceState
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putParcelable("data", myData)
}

6. Activity的启动流程是什么?

  1. Launcher调用过程

    • 点击图标
    • Launcher进程通过Binder调用AMS
    • AMS通知Launcher进入Paused状态
    • AMS启动目标Activity所在进程
  2. Activity创建过程

    • 创建ActivityThread
    • 创建Application
    • 创建Activity实例
    • 调用onCreate方法

7. Activity的任务栈是什么?

  1. 基本概念

    • 用于管理Activity实例
    • 遵循LIFO原则
    • 可以跨应用
  2. 管理方式

    • taskAffinity属性
    • launchMode属性
    • Intent的Flag

最佳实践

  1. 生命周期管理

    • 使用LifecycleObserver
    • 合理释放资源
    • 避免内存泄漏
  2. 状态保存

    • 使用ViewModel
    • 合理使用onSaveInstanceState
    • 持久化重要数据
  3. 启动模式选择

    • 根据业务需求选择
    • 注意任务栈管理
    • 避免过度使用singleInstance

注意事项

  1. 性能优化

    • 避免在生命周期方法中执行耗时操作
    • 合理使用懒加载
    • 及时释放资源
  2. 内存管理

    • 防止内存泄漏
    • 正确处理配置变更
    • 合理使用进程优先级
  3. 用户体验

    • 保持状态一致性
    • 平滑处理屏幕旋转
    • 合理处理后台恢复