# 行为事件上报

> 来源：https://help.gravity-engine.com/docs/client-sdk/android/track-events
> 说明如何使用 Gravity Engine Android SDK 上报业务事件，并管理事件公共属性。



本文档详细介绍了SDK提供的事件上报功能，帮助开发者全面采集用户行为事件数据，为业务分析和运营决策提供数据支持。

通过上报应用内用户行为事件，您可以：

* **完整记录用户行为**：追踪用户在应用内的关键操作路径
* **支持多维度分析**：通过事件属性丰富分析维度
* **构建数据闭环**：为产品优化和精准运营提供数据基础

## 1. 上报自定义事件 [#1-上报自定义事件]

> **如需上报自定义事件，您必须先在[元事件](https://web.gravity-engine.com/#/manage/metadata/metaEvent)中添加，否则会上报失败！**

您可以调用 `track` 方法，记录用户自定义事件。

您需要先在[元事件](https://web.gravity-engine.com/#/manage/metadata/metaEvent)中添加自定义事件，然后在游戏中指定位置埋点调用 `track` 方法上报自定义事件。

```java
JSONObject jsonObject = new JSONObject();
jsonObject.put("guild_id", "100");
jsonObject.put("guild_level", 10);
jsonObject.put("guild_name", "北方之狼");
gravityEngineSDKInstance.track("AddGuild", jsonObject);
```

* 事件名称是 `String` 类型，只能以字母开头，可包含数字，字母和下划线 “\_”，长度最大为 50 个字符。
* 事件属性是 `Map<String, Object>` 类型，其中每个元素代表一个属性；
  * 事件属性 `Key` 为属性名称，为 `String` 类型，规定只能以字母开头，包含数字，字母和下划线 “\_”，长度最大为 50 个字符；
  * 属性 `Value` 支持`String`、`int`、`float`、`boolean`、`Date`、`List<String>`；当事件属性为列表类型时，您需要使用 `JSONArray` 传入，不要使用 ArrayList，否则会校验失败！

当您调用 `track` 时，SDK 会取系统当前时间作为事件发生的时刻，如果您需要指定事件时间，可以传入 `Date` 类型的参数来设置事件触发时间。

SDK 提供了时间校准接口，允许使用服务器时间对 SDK 时间进行校准，具体请参考[进阶功能](/docs/client-sdk/android/advanced)中关于时间校准章节的说明。

> **尽管事件可以设置触发时间，但是接收端会做如下的限制：只接收相对服务器时间在前 10 天至后 1 小时的数据，超过时限的数据将会被视为异常数据，整条数据无法入库!**

## 2. 设置公共事件属性 [#2-设置公共事件属性]

> **公共属性需要先在[事件属性](https://web.gravity-engine.com/#/manage/metadata/eventProperty)中添加，否则会上报失败!**

对于一些通用的属性，譬如玩家的区服和渠道等，这些属性需要设置在每个事件中，此时您可以将这些属性设置为公共事件属性。公共事件属性指的就是每个事件都会带有的属性，您可以调用 `setSuperProperties` 来设置公共事件属性，我们推荐您在发送事件前，先设置公共事件属性。

```java
JSONObject superProperties = new JSONObject();
superProperties.put("AGE",29);
superProperties.put("CHANNEL","xiaomi");
gravityEngineSDKInstance.setSuperProperties(superProperties);
```

公共事件属性将会被保存到缓存中，无需每次启动 APP 时调用。如果调用 `setSuperProperties` 上传了先前已设置过的公共事件属性，则会覆盖之前的属性。如果公共事件属性和 `track()` 上传的某个属性的 Key 重复，则该事件的属性会覆盖公共事件属性。

### 删除公共事件属性 [#删除公共事件属性]

如果您需要删除某个公共事件属性，可以调用 `unsetSuperProperty` 清除其中一个公共事件属性；

```java
// 清除属性名为 CHANNEL 的公共属性
gravityEngineSDKInstance.unsetSuperProperty("CHANNEL");
```

### 清空公共事件属性 [#清空公共事件属性]

如果您想要清空所有公共事件属性，则可以调用 `clearSuperProperties`;

```java
// 清空所有公共属性
gravityEngineSDKInstance.clearSuperProperties();
```

### 获取公共事件属性 [#获取公共事件属性]

如果您想要获取所有公共事件属性，可以调用`getSuperProperties`;

```java
// 获取所有公共属性
gravityEngineSDKInstance.getSuperProperties();
```

## 3. 记录事件时长 [#3-记录事件时长]

如果您需要记录某个事件持续时长，您可以调用 `timeEvent` 来开始计时，配置您想要计时的事件名称，当您上传该事件时，将会自动在您的事件属性中加入 `$event_duration` 这一属性来表示记录的时长，单位为秒。

```java
// 调用 timeEvent 开启对 TIME_EVENT 事件的计时
gravityEngineSDKInstance.timeEvent("TIME_EVENT");

// do some thing...

// 通过 track 上传 TIME_EVENT 事件时，会在属性中添加 $event_duration 属性
gravityEngineSDKInstance.track("TIME_EVENT");
```

## 4. 立即上报事件 [#4-立即上报事件]

如果需要立即上报缓存的事件，可以调用 `flush` 来上报所有缓存的事件。

```java
// 调用 flush() 上报缓存事件
gravityEngineSDKInstance.flush();
```
