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设置singleTask且taskAffinity="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孤独一栈无同伴。
  • 面试技巧:结合绘图(任务栈变化)和实际代码逻辑,展示对机制的透彻理解。
相关推荐
Goway_Hui1 小时前
【KMP for OpenHarmony】-- 在鸿蒙工程中使用 Apollo-Kotlin
华为·kotlin·harmonyos
Patrick在香港1 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA2 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
释厄6232 小时前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
booboosui3 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng4 小时前
Android获取崩溃日志
android
aqi004 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
D e re k ZH4 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
GY-934 小时前
【Android】Android Studio 中的协程
android