NavigationService

# NavigationService

解析和打开 autumnbox:// URI,实现跨 App 跳转和插件间通信。

import { useService, useServiceState } from '@autumnbox/sdk/hooks';
import { NavigationService } from '@autumnbox/sdk/hooks';

# URI 格式

autumnbox://{appId}/{path}?{param}={value}
部分 说明 示例
appId 目标 App 的 id file-managershellsettings
path 路径信息(可选) /sdcard/Download/appearance
param=value 查询参数(可选) device=abc123tab=security

示例 URI:

  • autumnbox://file-manager — 打开文件管理器
  • autumnbox://file-manager/sdcard/Download — 打开文件管理器并定位到 Download
  • autumnbox://settings?tab=appearance — 打开设置页定位到外观标签
  • autumnbox://shell?device=R5CT200XXXX — 打开 Shell 并关联指定设备

# 打开 App

const nav = useService(NavigationService);

// 简单打开
nav.open('autumnbox://file-manager');

// 带路径和参数
nav.open('autumnbox://shell?device=R5CT200XXXX');

行为规则:

App 类型 已有实例 行为
singleton: true 没有 开新 Tab
singleton: true 切换到已有 Tab + 发出 navigationEvent
singleton: false / 未设 总是开新 Tab

# 接收导航事件

当 singleton App 已打开时,再次导航不会开新 Tab,而是通过 navigationEvent 通知当前实例。这让同一个 App 可以响应不同的路由:

const FileManager: React.FC = () => {
  const nav = useService(NavigationService);
  const event = useServiceState(nav.navigationEvent);
  const [currentPath, setCurrentPath] = React.useState('/sdcard');

  React.useEffect(() => {
    if (event && event.appId === 'file-manager') {
      // 用户从其他地方导航过来,跳转到新路径
      setCurrentPath(event.path);
      // 读取查询参数
      const highlight = event.params['highlight'];
      if (highlight) {
        // 高亮某个文件
      }
    }
  }, [event]);

  return <div>当前路径: {currentPath}</div>;
};
interface NavigationRequest {
  appId: string;                    // 目标 App ID
  path: string;                     // 路径部分(默认 '/')
  params: Record<string, string>;   // 查询参数
}

# 实战示例:跨插件跳转按钮

在你的 App 中添加"在文件管理器中打开"按钮:

import { Button } from 'antd';
import { FolderOpenOutlined } from '@ant-design/icons';
import { useService } from '@autumnbox/sdk/hooks';
import { NavigationService } from '@autumnbox/sdk/hooks';

const OpenInFileManager: React.FC<{ path: string }> = ({ path }) => {
  const nav = useService(NavigationService);

  return (
    <Button
      icon={<FolderOpenOutlined />}
      onClick={() => nav.open(`autumnbox://file-manager${path}`)}
    >
      在文件管理器中打开
    </Button>
  );
};

// 使用
<OpenInFileManager path="/sdcard/Download" />

# 下一步