厂内的BaseActivity代码非常完整,作为一个非常成熟的基类。功能覆盖了 Android Activity 的生命周期管理、UI沉浸式、侧滑返回、底部/顶部统一框架、悬浮球、夜间模式、动画优化等很多高阶场景。
1. 生命周期和状态管理的规范化
- 使用
mDestroyed和isValid()方法来统一判断 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 封装
- 单例/服务管理:
BoxMessageManager、ServiceManager用单例或服务容器统一管理
- 弱引用防止内存泄漏:
preActivity使用WeakReference<Activity>防止 Activity 泄漏
- 兼容性与降级处理:
- 对不同 Android 版本、横竖屏、折叠屏、平板做处理
更新: 2025-10-31 15:13:20
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/gczmegf8qoueyav7