Foreground Application Period
应用处于前台的一个时段
前台应用时段表达“应用 A 处于前台”。它保存对本机应用的引用和当时读到的应用名称;这一段从几点到几点,保存在引用它的 Observation 上。
粒度
一个应用连续处于前台的一段活动,对应一份 Observation。每次确认都在补全这一份 Observation;窗口标题变化时,应用时段照样延续。
前台时段只表达系统确认的前台应用。锁屏、休眠和无输入属于其他时间线,读取方需要时再组合,见 Desktop · 各自的时间线。
身份
本机应用、应用名称或时区变化时,前台状态 Observer 结束当前时段,新建观测内容和 Observation,原来的内容保持不变。
引用
| 字段 | 目标 |
|---|---|
localApplicationVersionId | Local Application |
事实时间
应用、名称和时区都没变时,每次确认都延长同一份 Observation:观测内容和开始时间保持不变,结束时间更新为这次确认的时刻。这个结束时间只是最近一次确认,不代表这段已经结束,见 TIME-4。
| 事件 | 当前时段 | 下一个时段 |
|---|---|---|
| 首次确认应用在前台 | — | 从确认时刻开始 |
| 切换应用,或名称、时区变化 | 结束于新的确认时刻 | 从同一时刻开始 |
| 读取失败、停止采集或程序退出 | 结束于最后一次确认 | 恢复后新建 |
| 两次确认的间隔超过定时间隔的 3 倍 | 结束于最后一次确认 | 从恢复后的确认时刻开始 |
| 系统时间跳变,原来的边界无法延续 | 结束于最后一次确认 | 从恢复后的确认时刻开始 |
| 系统即将休眠 | 结束于最后一次确认 | 唤醒后重新读取,从新的确认时刻开始 |
- 两个边界都已知时,时段是
[startAt, endAt)。只确认过一次时,开始和结束相同,时长为零。 - 应用激活事件随时触发确认,定时确认默认每 1 秒一次,断开的阈值是定时间隔的 3 倍。
- 系统时间倒退或重复时断开。墙上时间的增量与持续计时的增量相差超过 100 毫秒时,同样断开。
- 休眠期间程序不运行,没有确认的证据,所以休眠通知会结束当前时段。如果漏掉了通知,包含休眠和不含休眠的两种计时之差会超过 100 毫秒,时段同样断开。macOS 两种计时的区别见 Mach 时间接口。
- 时段的边界取确认的时刻。定时读取只确认当前的状态,两次定时确认之间发生的切换由应用激活事件补上。
timeZone是采集时本机的 IANA 时区,未知时为null。
EntitySchema
| 项目 | 值 |
|---|---|
| SchemaId | 019e1bbb-ec00-7000-8000-000000000001 |
| 显示名称 | 前台应用时段 |
| 说明 | 表达某个本机应用连续处于前台的一段活动;内容保存应用引用与当时读到的名称,Observation 保存时段。 |
| 资源名 | foreground-application-periods |
| 字段 | 类型 | 必填 | 可空 | 含义 |
|---|---|---|---|---|
localApplicationVersionId | reference | 是 | 否 | 观测设备上的本机应用 |
name | string | 是 | 是 | 当时读到的应用名称,没读到时为 null |
示例
VS Code 从 10:00 到 10:20 处于前台,时段结束后,POST /versions 依次提交观测内容和它的 Observation。localApplicationVersionId 是本机应用首版的 VersionId,observerVersionId 是程序实例的一个版本:
{
"versions": [
{
"entityId": "01a12e31-9050-7000-8000-000000000020",
"versionId": "01a12e31-9050-7000-8000-000000000120",
"previousVersionId": null,
"category": "business",
"schemaVersionId": "019e1bbb-ec00-7000-8000-000000000101",
"content": {
"localApplicationVersionId": "01a12e31-9050-7000-8000-000000000101",
"name": "Visual Studio Code"
}
},
{
"entityId": "01a12e31-9050-7000-8000-000000000030",
"versionId": "01a12e31-9050-7000-8000-000000000130",
"previousVersionId": null,
"category": "observation",
"schemaVersionId": null,
"content": {
"observerVersionId": "01a12e31-9050-7000-8000-0000000000a1",
"contentVersionId": "01a12e31-9050-7000-8000-000000000120",
"inputSetVersionId": null,
"startAt": "2026-10-06T02:00:00Z",
"endAt": "2026-10-06T02:20:00Z",
"timeZone": "Asia/Shanghai"
}
}
]
}