Android Navigation 架构

一、整体架构概览

Android Navigation 组件是一个层次化、可扩展的导航框架,其核心组件协同工作实现应用导航管理:

二、核心组件详解

1. NavHostFragment - 导航容器

  • 角色:导航的物理容器和起点

  • 职责

    • 提供 Fragment 容器(通常是 FragmentContainerView

    • 创建并持有 NavController 实例

    • 拦截系统返回键事件

    • 实现 NavHost 接口

  • 关键生命周期

    public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      // 创建 NavController
      mNavController = new NavController(requireContext());
      mNavController.setLifecycleOwner(this);
      // 设置导航图
      if (mGraphId != 0) {
          mNavController.setGraph(mGraphId);
      }
    }

2. NavController - 导航控制中心

  • 角色:导航系统的中央协调器

  • 核心职责

    • 管理当前导航状态

    • 处理导航操作(navigate/popBackStack)

    • 维护返回栈(NavBackStack

    • 协调各种 Navigator

  • 关键数据结构

    public class NavController {
        private NavGraph mGraph; // 当前导航图
        private final Deque<NavBackStackEntry> mBackStack = new ArrayDeque<>();
        private final NavigatorProvider mNavigatorProvider;
        private Context mContext;
        // ...
    }

3. NavigatorProvider - 导航器工厂

  • 角色Navigator 的注册中心和工厂

  • 职责

    • 注册/注销 Navigator

    • 按类型提供 Navigator 实例

    • 支持自定义 Navigator

  • 核心实现

    public class NavigatorProvider {
        private final HashMap<String, Navigator<? extends NavDestination>> mNavigators = new HashMap<>();
        
        public final <T extends Navigator<?>> T getNavigator(@NonNull Class<T> clazz) {
            String name = clazz.getSimpleName();
            Navigator<? extends NavDestination> navigator = mNavigators.get(name);
            // ...
            return (T) navigator;
        }
    }

4. Navigator - 导航执行器

  • 角色:具体导航操作的执行者

  • 职责

    • 处理特定类型目标的导航

    • 实现导航和返回栈操作

    • 管理目标生命周期

  • 类型体系

5. NavGraph - 导航蓝图

  • 角色:导航路线的抽象定义

  • 结构

    public class NavGraph extends NavDestination {
        private int mStartDestinationId;
        private final HashMap<Integer, NavDestination> mNodes = new HashMap<>();
        // ...
    }

  • 关键元素

    • 起始目标(startDestination

    • 目标集合(NavDestination

    • 动作连接(NavAction

6. NavDestination - 导航目标

  • 角色:导航的终点单元

  • 类型

    • FragmentDestination

    • ActivityDestination

    • DialogDestination

    • NavGraph(嵌套图)

  • 关键属性

    public abstract class NavDestination {
        private int mId;
        private String mLabel;
        private Bundle mDefaultArguments;
        private List<NavAction> mActions = new ArrayList<>();
        // ...
    }

三、组件协作流程

1. 初始化流程

2. 导航执行流程(navigate())

3. 返回栈管理流程(popBackStack())

四、关键设计解析

1. 责任链模式

  • NavController 作为中央调度器

  • 将具体导航操作委托给专门的 Navigator

  • 符合单一职责原则

2. 抽象工厂模式

  • NavigatorProvider 作为工厂

  • 隐藏具体 Navigator 的创建细节

  • 支持灵活扩展

3. 组合模式

  • NavGraph 包含多个 NavDestination

  • NavDestination 可以是原子目标或嵌套图

  • 实现导航结构的树形组织

4. 状态管理

  • NavBackStack 维护导航状态

  • 每个条目包含:

    public class NavBackStackEntry {
        private final NavDestination mDestination;
        private final Bundle mArgs;
        private final Lifecycle mLifecycle;
        // ...
    }
  • 完整的生命周期管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xzkyd outpaper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值