Android Activity启动模式面试题

在Android面试中,Activity启动模式是高频考点,需深入理解其机制与应用场景。以下是精讲内容,结构清晰,便于记忆与表达:


1. 四种启动模式的核心区别

  • standard(默认模式)

    • 每次启动均创建新实例,遵循"后进先出"的栈结构。
    • 示例:从Activity A(standard)跳转自身,栈中不断新增A的实例。
  • singleTop(栈顶复用)

    • 若目标Activity位于栈顶,则复用实例(调用onNewIntent),否则新建。
    • 应用场景:防止连续点击导致重复页面(如支付按钮跳转)。
  • singleTask(栈内单例)

    • 在指定任务栈中保持唯一实例。若存在,则清除其上方所有Activity,并调用onNewIntent
    • 关键点 :通过taskAffinity指定任务栈,默认与包名一致。
    • 典型应用:App主页(如微信主界面)。
  • singleInstance(全局单例)

    • 独占一个任务栈,且栈内仅自身。其他Activity启动时进入其他栈。
    • 使用场景:独立运行的界面(如系统拨号盘)。

2. 高频面试题解析

Q1:singleTask与taskAffinity的关系?

    • 默认情况下,singleTask的Activity位于应用主任务栈。
    • 若设置不同taskAffinity,则会创建新任务栈。例如,Activity A设置singleTasktaskAffinity="com.example.task2",启动时会新建独立栈。

Q2:从Activity A(standard)启动B(singleTask),B启动C(singleTop),C再启动B,栈状态如何?

    1. A启动B → 新建任务栈(假设B的taskAffinity不同),栈1:A,栈2:B
    2. B启动C → 栈2变为B, C
    3. C启动B → 栈2中B已存在,清除C,调用onNewIntent,栈2:B

Q3:onNewIntent调用时机与数据处理?

    • 在singleTop/singleTask模式下,若Activity被复用,系统调用onNewIntent()

    • 关键代码

      java 复制代码
      @Override
      protected void onNewIntent(Intent intent) {
          super.onNewIntent(intent);
          setIntent(intent); // 更新Intent
          handleData(intent); // 处理新数据
      }

3. Intent Flags与启动模式的协同

  • FLAG_ACTIVITY_NEW_TASK
    • 结合taskAffinity创建新任务栈。若未指定,则与默认栈行为一致。
  • FLAG_ACTIVITY_SINGLE_TOP
    • 等同于singleTop模式,优先复用栈顶实例。
  • FLAG_ACTIVITY_CLEAR_TOP
    • 若目标Activity已存在,清除其上方所有实例。与singleTask配合时,复用实例;否则销毁重建。

4. 典型场景与误区

  • 场景:避免重复打开同一页面

    • 方案 :对详情页使用singleTop,或在Intent中添加FLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP
  • 误区:singleTask一定在新栈中?

    • 错误!仅当taskAffinity与当前栈不同时,才会创建新栈。

5. 生命周期与启动模式

  • 复用Activity时的生命周期
    顺序为:原实例onPause() → 新实例onCreate()(若新建) → 原实例onNewIntent()onResume()

总结

  • 核心口诀
    • standard堆叠无脑创,singleTop栈顶防重复。
    • singleTask栈内单例清上方,singleInstance孤独一栈无同伴。
  • 面试技巧:结合绘图(任务栈变化)和实际代码逻辑,展示对机制的透彻理解。
相关推荐
Mr YiRan11 分钟前
网络请求API监控与网络切换埋点
android·网络
美狐美颜sdk4 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
奈斯先生Vector9 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine9 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义11 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
古法安卓14 小时前
Android-Fork 机制详解
android·java·android studio
JMchen14 小时前
第 12 篇|项目整合与打包发布 —— 从 Demo 到可安装 APK 的完整收官指南
kotlin·android studio
Android打工仔14 小时前
不要在 Data 层随意把 Cold Flow 转换成 Hot Flow
android·架构·kotlin
峥嵘life15 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧15 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow