Files

73 lines
2.3 KiB
Markdown

# OPEN **[提案]**
> [返回动作目录](README.md) · [任务协议](../protocol.md) · [Condition](../flow-control.md#2-condition-提案)
OPEN 用于启动 App、把 App 带到前台或打开 URI。当前代码尚未实现。
## 1. 打开 App
~~~json
{
"id": "open-target",
"action": "OPEN",
"target": {
"type": "APP",
"packageName": "com.example.target"
},
"expectedPackageName": "com.example.target",
"after": {
"state": "PAGE_STABLE",
"stableForMs": 300
},
"timeoutMs": 10000
}
~~~
APP 已经在前台时不重复启动,直接执行 after。否则通过 PackageManager 获取启动 Intent,并从 Service 上下文使用 `FLAG_ACTIVITY_NEW_TASK`。
## 2. 打开 URI
~~~json
{
"id": "open-link",
"action": "OPEN",
"target": {
"type": "URI",
"uri": "exampleapp://items/123",
"handler": "PACKAGE",
"packageName": "com.example.target"
},
"expectedPackageName": "com.example.target",
"timeoutMs": 10000
}
~~~
`handler` 首批支持:
- `PACKAGE`:由指定包处理,推荐用于已知深链。
- `DEFAULT`:使用系统默认处理程序。
如果需要限制 URI 的 scheme、host 或来源页面,可以作为部署配置或任务字段增加,不作为首版通用动作的固定门禁。
## 3. 执行规则
1. 解析目标并确认 App 已安装或 URI 有处理程序。
2. 目标已经在前台时跳过 Intent 分发。
3. 最多分发一次 Intent。
4. 等待 `expectedPackageName` 成为前台。
5. 提供 after 时继续验证页面条件。
`timeoutMs` 覆盖解析、启动、等待前台和 after。Intent 返回成功不等于目标页面已经准备完成。
OPEN 不写入任何具体 App 的页面文案、深链或恢复流程;这些内容由任务或目标 App 适配层提供。
## 4. 结果码
见[结果码总表](README.md#结果码总表)。OPEN 使用 `OK`、`PACKAGE_MISMATCH`、`ACTION_FAILED`(未安装、无处理程序或 Intent 分发失败)和 `VERIFICATION_FAILED`。
“已在前台”“已进入前台但未验证”属于成功的细节,放在 `detail` 而不是 `code`。未安装与无处理程序是否需要独立码,等实现时按排查需要决定。
## 5. 测试
单元测试覆盖已在前台、冷启动、无处理程序、单次分发、目标包不符和 after 超时。任务栈恢复、后台启动限制和厂商系统差异需要真机验证。