用户体验数据相关接口
自定义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;
}