用户体验数据相关接口
自定义Trace埋点
由于 TingYun_SDK 默认关注系统类和方法,无法关注「业务代码」的耗时情况,使用「自定义埋点」接口可以补全「页面体验分析」和「操作体验分析」模块中的【分解图】,能够帮助开发者清晰的了解其业务代码的耗时及调用情况。
- 相关接口
注意:「自定义Trace埋点」接口需要成对调用,请勿跨方法、跨进程以及在异步加载和递归调用中使用该接口。
/**
* @param tracerName 为当前方法所在方法名或自定义名称,支持中文、英文、数字、下划线,但不能包含空格或其他的转义字符
*/
NBSAppAgent.beginTracer(String tracerName);
NBSAppAgent.endTracer(String tracerName);
- 代码示例
//用户可以在SDK初始化后的任意方法前后添加自定义Trace
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
//方法开始前添加beginTracer
NBSAppAgent.beginTracer(“这是Init方法”);
try {
………
} catch (NameNotFoundException e) {
e.printStackTrace();
}
//方法结束后添加endTracer
NBSAppAgent.endTracer(“这是Init方法”);
}
自定义冷启动耗时
TingYun_SDK 默认计算 SDK 初始化开始至第一个页面加载结束的时间为「冷启动耗时」,研发人员可以根据自身应用需求更改计算「冷启动耗时」的结束点。
开启自定义冷启动耗时控制开关
相关接口
/** * @param isCustom 默认为 false,设置为 true 开启自定义启动耗时 */ NBSAppAgent.isCustomAppStart(boolean isCustom);
代码示例
public class MyApplication extends Application { @Override public void onCreate() { NBSAppAgent.setLicenseKey("AppKey") .isCustomAppStart(true)//在初始化SDK时调用,开启自定义启动时间功能 .start(this.getApplicationContext()); } }
设置自定义冷启动耗时的结束点
该接口需要与「isCustomAppStart」配合使用,当设置「isCustomAppStart」接口为 true 时,「setCustomOnResumeEndIns」接口设置生效。
相关接口
/** * @param className 需传入启动的第一个 Activity 的 class.getName,需在第一个 Activity onResume() 结束之后调用 */ NBSAppAgent.setCustomOnResumeEndIns(String className);
代码示例
public class MyApplication extends Application { @Override public void onCreate() { NBSAppAgent.setLicenseKey("AppKey") .isCustomAppStart(true)//在初始化SDK时调用,开启自定义启动时间功能 .start(this.getApplicationContext()); } } public class SplashActivity extends Activity { //启动的第一个Activity } public class MainActivity extends Activity { //启动的第二个Activity @Override public void onResume() { super.onResume(); NBSAppAgent.setCustomOnResumeEndIns(SplashActivity.class.getName()); //以第二个Activity的onResume()方法作为启动结束时间 } }
自定义页面结束
在页面加载分析模块,SDK 默认以异步请求完成的时间点作为页面内容加载完成的时间点。用户可以通过 setPageLoadingEndTime() 方法手动埋点,设置页面结束时间点。
- 相关接口
/**
* @param clazz 为页面 Activity 的 class
*/
NBSAppAgent.setPageLoadingEndTime(Class clazz);
- 代码示例
//用户可以在页面加载回调中(或其他合适的位置),调用setPageLoadingEndTime()方法
private void showSuccess() {
networkStateView.showSuccess();
// 传入当前 Activity.class 或当前 Fragment.class
NBSAppAgent.setPageLoadingEndTime(MainActivity.class);
}
自定义操作
通过「自定义操作」来定义一个【业务操作】用以了解其性能表现情况.
- 相关接口
注意:「自定义操作」接口需要成对调用,actionName不可为空,支持跨方法、跨线程调用。
/**
* @param actionName 操作名称
*/
standbyEventActionStart(String actionName);
standbyEventActionEnd(String actionName);
- 代码示例
private void login() {
NBSAppAgent.standbyEventActionStart(“login”);
………
NBSAppAgent.standbyEventActionEnd(“login”);
}
设置 ViewID
设置 viewId 后,平台「操作分析」和「可视化命名」功能会优先使用该属性进行归类。
- 相关接口
/**
* @param view 为要设置 ID 的控件
* @param viewId 为设置的控件 ID,viewId 最多可包含 128 个字符,支持英文、数字、下划线
*/
NBSAppAgent.setViewId(View view, String viewId);
- 代码示例
Button button = findViewById(R.id.bt_login);
NBSAppAgent.setViewId(button, "login");
设置 ViewName
设置ViewName后,平台「操作分析」和「可视化命名」功能会优先使用该属性进行归类。
- 相关接口
/**
* @param view View 对象
* @param description ViewName,最多包含 128 个字符
*/
setViewContent(View view, String description)
- 代码示例
Button button = findViewById(R.id.bt_login);
NBSAppAgent.setViewContent(button, "登录");
设置 PageName「视图别名」
设置 PageName 后,平台「操作分析」和「可视化命名」功能会优先使用该属性进行归类。
- 相关接口
/**
* @param activity Activity 对象
* @param fragment Fragment 对象
* @param alias PageName,最多可包含 128 个字符
*/
setPageName(Activity activity, String alias)
setPageName(Fragment fragment, String alias)
- 代码示例
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_uiactivity);
NBSAppAgent.setPageName(this, "主页");
}
}
采集列表操作 item 位置
若项目使用的是 androidx 包的 RecyclerView,且重写了 onBindViewHolder(),SDK 可以自动嵌码采集 item 位置数据。若项目使用的是 ListView(GridView) 或 support 包的 RecyclerView ,需要手动调用 setRowTagForList() 方法采集 item 位置数据。
- 相关接口
/**
* 采集 support 包的 RecyclerView 或 ListView(GridView),需要在 Adapter 中埋点
* @param obj item View
* @param position 位置
*/
NBSActionInstrumentation.setRowTagForList(Object obj, int position)
- 代码示例
// 如果使用了 support 包的 RecyclerView,需要在 Adapter 的 onBindViewHolder() 方法末行埋点
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
...// 其他代码
NBSActionInstrumentation.setRowTagForList(holder.itemView, position);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) {
super.onBindViewHolder(holder, position, payloads);
...// 其他代码
NBSActionInstrumentation.setRowTagForList(holder.itemView, position);
}
// 如果使用了 ListView 或 GridView,需要在 Adapter 的 getView() 方法末行埋点
public View getView(int position, View convertView, ViewGroup parent) {
...// 其他代码
NBSActionInstrumentation.setRowTagForList(view, position);
return view;
}