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孤独一栈无同伴。
  • 面试技巧:结合绘图(任务栈变化)和实际代码逻辑,展示对机制的透彻理解。
相关推荐
李新_9 小时前
我们使用了哪些Flutter 三方库(二)
android·flutter·ios
二流小码农10 小时前
鸿蒙开发:hvigorw,编译构建,实现命令打包
android·ios·harmonyos
龙之叶11 小时前
使用NMEA Tools生成GPS轨迹图
android
雨白12 小时前
ListView 使用详解:从入门、自定义到性能优化
android
百里东风12 小时前
STM32CubeDAC及DMA配置
android·stm32·嵌入式硬件
getapi12 小时前
flutter开发安卓APP适配不同尺寸的手机屏幕
android·flutter·智能手机
bytebeats12 小时前
移动开发中WebView使用的过去现在和未来
android·webview
恋猫de小郭12 小时前
腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
android·前端·flutter
Chenyu_31013 小时前
05.MySQL表的约束
android·开发语言·网络·数据库·网络协议·mysql·php
我的蒲公英13 小时前
2025年了,别再用微信群发APK了:内测分发的正确打开方式
android·安全·ios