NavigationService
AutumnBox
# 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-manager、shell、settings |
path | 路径信息(可选) | /sdcard/Download、/appearance |
param=value | 查询参数(可选) | device=abc123、tab=security |
示例 URI:
autumnbox://file-manager— 打开文件管理器autumnbox://file-manager/sdcard/Download— 打开文件管理器并定位到 Downloadautumnbox://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>;
};
# NavigationRequest 结构
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" />
# 下一步
- AppService — App 注册表
- OverlayService — 全局浮层