《Android全埋点解决方案》 —2.5 扩展采集能力

举报
华章计算机 发表于 2019/12/19 11:51:09 2019/12/19
【摘要】 本节书摘来自华章计算机《Android全埋点解决方案》 一书中第2章,第2.5节,作者是王灼洲 。

2.5 扩展采集能力

对于Activity的页面浏览事件,仅仅采集当前 Activity 的名称(包名 + 类名)是远远不够的,还需要采集当前 Activity 的 title(标题)才能满足实际的分析需求。

但是一个 Activity 的 title 的来源是非常复杂的,因为可以通过不同的方式来设置一个 Activity 的 title,甚至可以使用自定义的 View 来设置 title。比如说,可以在Android-Manifest.xml文件中声明 activity 时通过 android:label属性来设置,还可以通过 activity.setTitle()来设置,也可以通过 ActionBar、ToolBar 来设置。所以,在获取Activity 的 title 时,需要兼容不同的设置title的方式,同时更需要考虑其优先级顺序。

我们目前写了一个比较简单的方法来获取一个 Activity 的 title,内容参考如下:

/**

 * 获取 Activity 的 title

 * @param activity Activity

 * @return

 */

public static String getActivityTitle(Activity activity) {

    String activityTitle = null;

 

    if (activity == null) {

        return null;

    }

 

    try {

        activityTitle = activity.getTitle().toString();

 

        if (Build.VERSION.SDK_INT >= 11) {

            String toolbarTitle = getToolbarTitle(activity);

            if (!TextUtils.isEmpty(toolbarTitle)) {

                activityTitle = toolbarTitle;

            }

        }

 

        if (TextUtils.isEmpty(activityTitle)) {

            PackageManager packageManager = activity.getPackageManager();

            if (packageManager != null) {

                ActivityInfo activityInfo = packageManager.getActivityInfo(activity.getComponentName(), 0);

                if (activityInfo != null) {

                    activityTitle = activityInfo.loadLabel(packageManager).toString();

                }

            }

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    return activityTitle;

}

我们首先通过activity.getTitle() 获取当前 Activity 的 title,因为用户有可能会使用 ActionBar 或 ToolBar,所以我们还需要获取 ActionBar 或 ToolBar 设置的 title,如果能获取到,就以这个为准(即覆盖通过activity.getTitle()获取的 title)。如果以上两个步骤都没有获取到 title,那我们就要尝试获取 android:label 属性的值。

获取ActionBar或ToolBar的title逻辑如下:

@TargetApi(11)

private static String getToolbarTitle(Activity activity) {

    try {

        ActionBar actionBar = activity.getActionBar();

        if (actionBar != null) {

            if (!TextUtils.isEmpty(actionBar.getTitle())) {

                return actionBar.getTitle().toString();

            }

        } else {

            if (activity instanceof AppCompatActivity) {

                AppCompatActivity appCompatActivity = (AppCompatActivity) activity;

                android.support.v7.app.ActionBar supportActionBar = appCompat-Activity.getSupportActionBar();

                if (supportActionBar != null) {

                    if (!TextUtils.isEmpty(supportActionBar.getTitle())) {

                        return supportActionBar.getTitle().toString();

                    }

                }

            }

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

修改trackAppViewScreen(Activity activity)方法,添加设置$title 属性的逻辑:

/**

 * Track 页面浏览事件

 *

 * @param activity Activity

 */

@Keep

private static void trackAppViewScreen(Activity activity) {

    try {

        if (activity == null) {

            return;

        }

        if (mIgnoredActivities.contains(activity.getClass().hashCode())) {

            return;

        }

        JSONObject properties = new JSONObject();

        properties.put("$activity", activity.getClass().getCanonicalName());

        properties.put("$title", getActivityTitle(activity));

        SensorsDataAPI.getInstance().track("$AppViewScreen", properties);

    } catch (Exception e) {

        e.printStackTrace();

    }

}

运行 demo,可以看到打印的如下事件信息,参考图2-3。

 image.png

图2-3 页面浏览事件详细信息

至此,一个相对完善的用来采集页面浏览事件的全埋点方案就算完成了。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200