73 lines
2.3 KiB
Markdown
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 超时。任务栈恢复、后台启动限制和厂商系统差异需要真机验证。
|