厂内的BaseActivity代码非常完整,作为一个非常成熟的基类。功能覆盖了 Android Activity 的生命周期管理、UI沉浸式、侧滑返回、底部/顶部统一框架、悬浮球、夜间模式、动画优化等很多高阶场景。

1. 生命周期和状态管理的规范化

  • 使用mDestroyedisValid()方法来统一判断 Activity 是否可操作,避免在onDestroy()finish()后做 UI 操作报错。
  • onCreate()onPostCreate()onAttachedToWindow()等生命周期方法中有明确分工:
    • onCreate()→ 初始化底层数据、服务、状态管理
    • onPostCreate()→ UI 相关能力初始化(侧滑、沉浸式)
    • onAttachedToWindow()→ 动画渲染、特殊 UI 渲染优化

学习点:将 Activity 的初始化拆成「数据初始化 → UI 布局 → 动画/效果」几步,避免耦合。

2. 动画管理

  • Activity启动/结束动画做了封装:
    • setNextPendingTransition():设置下一次 Activity 的全局动画
    • setPendingTransition():设置当前 Activity 的动画
    • startEnterActivityAnim()/startExitActivityAnim():封装了调用overridePendingTransition
  • 还针对 Android 4.2-6.0 做了setDrawDuringWindowsAnimating()的优化,让动画过程中底层页面也能渲染。

学习点:动画逻辑抽象成独立方法,并提供全局配置和单次配置的区分,是大型项目中非常好的做法。

3. 侧滑返回功能

  • SlideHelper封装了侧滑能力。
  • 提供多种配置:
    • 是否开启侧滑 (mEnableSliding)
    • 根页面是否侧滑 (mEnableTaskRootSlide)
    • 侧滑取消是否透明 (mSlideCancelActivityTransparent)
    • 侧滑插值器 (SlideInterceptor) → 可在特殊情况下禁止侧滑
  • 通过 SlidingPaneLayout.PanelSlideListener 对侧滑事件进行细粒度控制:
    • 控制上一个页面的位置 (setPreDecorPosition)
    • 动态调整透明度
    • 触发退场统计

学习点:自定义侧滑返回时要考虑 透明度、上一个页面位置、兼容不同屏幕方向 等复杂情况。

4. 沉浸式状态栏/导航栏封装

  • 使用ImmersionHelper封装状态栏/导航栏颜色设置。
  • 支持动态切换:
    • setEnableImmersion(boolean enable)→ 可动态关闭沉浸式
    • applyImmersion()→ 可应用自定义颜色
  • 夜间模式也与沉浸式结合:
@Override
public void onNightModeChanged(boolean isNightMode) {
    if (mEnableImmersion) {
        applyImmersion();
    }
}

学习点:沉浸式可以用 helper 抽象,方便全局统一控制,并与夜间模式解耦。

5. 夜间模式的 EventBus 化

  • 使用NightModeHelper.subscribeNightModeChangeEvent(tagObject, this),通过 tagObject 注册,解耦业务逻辑。
  • 页面只需重写onNightModeChanged(boolean),不需要自己关心 EventBus。

学习点:用注册 tag + 接口回调的方式实现可解耦的全局通知系统。

6. 顶部/底部统一框架设计

  • 顶部栏、底部栏、菜单、悬浮球都提供了扩展接口:
IActionBarExtObject, IToolBarExtObject, ICommonMenuExtObject
  • 提供默认实现和更新方法:
    • updateUnifiedThreeIconTopBarConfig()
    • useUnifiedBottomBar()
  • 可以灵活替换 UI 组件,而不用改 BaseActivity 内部逻辑。

学习点:在大型项目中,统一 UI 框架并提供可扩展接口,是降低耦合和复用率的重要手段。

7. 对 Android 版本差异的兼容

  • 虚拟按键判断 (checkDeviceHasNavigationBar()) → 考虑厂商差异
  • 权限请求 (checkSelfPermission(), requestPermission()) → 兼容低于 Android 6.0
  • 动画渲染优化 → 针对 4.2/4.3 特殊处理
  • 横竖屏、折叠屏、平板适配 (FoldStateMgr, MessageDeviceAdapter)

学习点:大型框架代码要充分考虑 Android 版本差异和厂商定制机型。

8. 可复用的工具方法

  • setViewPaddingStartAndEndOnPad()→ 平板横屏适配
  • setCurrentActivityNoTransparent()→ 动态控制透明度
  • addOnNewIntentCallback()/deleteOnNewIntentCallback()→ 支持onNewIntent()多回调

学习点:工具方法的封装,减少重复代码,并保证可扩展性。

9. 统计埋点接口

  • doBackStatistic()/slideBackStatistic()→ 抽象成方法,可在子类实现具体逻辑。
  • 页面打点信息统一通过getFrom(), getPage(), getSource()获取。

学习点:埋点逻辑与业务逻辑解耦,方便统一管理和后期扩展。

10. 总体设计模式与架构思路

  • 模板方法:生命周期方法中对流程有固定调用顺序(onCreate → applySliding → applyImmersion)。
  • 策略模式/委托模式
    • 顶部栏/底部栏/侧滑行为/沉浸式 UI 都用 Helper 或 Interface 封装
  • 单例/服务管理
    • BoxMessageManagerServiceManager用单例或服务容器统一管理
  • 弱引用防止内存泄漏
    • preActivity使用WeakReference<Activity>防止 Activity 泄漏
  • 兼容性与降级处理
    • 对不同 Android 版本、横竖屏、折叠屏、平板做处理

更新: 2025-10-31 15:13:20
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/gczmegf8qoueyav7


相关笔记