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孤独一栈无同伴。
  • 面试技巧:结合绘图(任务栈变化)和实际代码逻辑,展示对机制的透彻理解。
相关推荐
哲科软件8 小时前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
jyan_敬言15 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
程序员老刘15 小时前
Android 16开发者全解读
android·flutter·客户端
福柯柯16 小时前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩16 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子16 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖16 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户20187928316716 小时前
🌟 童话:四大Context徽章诞生记
android
yzpyzp16 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
aningxiaoxixi16 小时前
安卓之service
android