Android Navigation 架构
一、整体架构概览
Android Navigation 组件是一个层次化、可扩展的导航框架,其核心组件协同工作实现应用导航管理:
二、核心组件详解
1. NavHostFragment - 导航容器
-
角色:导航的物理容器和起点
-
职责:
-
提供 Fragment 容器(通常是
FragmentContainerView
) -
创建并持有
NavController
实例 -
拦截系统返回键事件
-
实现
NavHost
接口
-
-
关键生命周期:
public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 创建 NavControllermNavController = 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;// ... }
-
完整的生命周期管理