在我们展开讨论之前,首先要明白什么是用户行为记录?

我的理解是 用户行为记录是针对使用我们软件的用户的信息统计,这些信息主要是 用户的操作信息 以及 其他一些相关感兴趣的日志信息,这些信息通常由用户的操作而产生,经我们包装处理后上传到服务器,以供数据分析员使用分析。不要小看这些信息,分析信息可以让我们了解软件的用户群,平台信息,以及用户的操作习惯等,现在已经有越来越多的开发者和公司重试并利用这一块。

ok,既然我们是讨论解决方案的,闲话之后直入主题,怎么做?

1.用户行为记录信息的组成 一条完整有价值的用户行为记录应该包含哪些内容呢?无疑,用户本身的点击代表的操作是主要信息,比如用户在支付页面点击了支付,这样的一个行为能提取出“支付页”和“支付”两个有价值的信息,此外,产生这个操作的时间戳信息,用户的机器信息(手机型号等),SDK版本号以及用户的网络类型信息等。

2.用户行为记录从哪来?到哪去? 每一条用户行为记录都是由用户的操作产生的,这些信息最终会被上传到服务端保存分析。我们要做的工作就是将每条有价值的用户行为记录信息保存并上传至服务器。当然,出于应用耗电量以及程序效率的考虑,我们不可能在每次用户产生操作记录时,都发送服务将信息上传到服务器。所以我们可以采用 缓存--文件--上传服务器的策略。

明白了上面这些信息,解决方案就出来了。

 1 /**
 2  * 用户行为记录
 3  *
 4  * @author derson2388
 5  *
 6  */
 7 public class UserActionManager {
 8
 9     private static UserActionManager manager;
10
11     /**
12      * 工作线程消息队列处理
13      */
14     private Handler mHandler;
15     /**
16      * 日志缓存
17      */
18     private ArrayList<String> mCache = new ArrayList<String>();
19
20     /**
21      * 单例访问,同步上锁
22      *
23      * @return
24      */
25     public synchronized UserActionManager getInstance() {
26         if (null == manager) {
27             manager = new UserActionManager();
28         }
29         return manager;
30     }
31
32     private UserActionManager() {
33         new Thread(new Runnable() {
34
35             @Override
36             public void run() {
37                 // 新启动一个工作线程,启动Looper后创建handler处理写入请求
38                 Looper.prepare();
39                 mHandler = new Handler(Looper.myLooper());
40                 Looper.loop();
41             }
42         }).start();
43     }
44 }

UserActionManager

上面的代码有几点值得注意:

1.UserActionManager为全局程序提供了一个单例访问的实例,缓存cache用于缓存用户行为记录,当缓存到达一定的阀值时,才把缓存里的日志写入文件,当文件大小到达一定大小时,才将日志信息通过网络发送到服务器。

2.构造函数里在新启的工作线程里启动了一个新的Looper并以此构造了一个专门处理该工作线程消息队列的handler,这样记录用户,写入文件,上传服务器等都可以通过这个handler分发/处理到工作线程的消息队列MessageQueue里,避免了主线程ANR的风险。

 1     /**
 2      * 用户行为记录
 3      *
 4      * @param action
 5      */
 6     public synchronized void writeUserCode(String action) {
 7         // TODO 在这里对用户行为信息做格式化组装
 8         mCache.add(action);
 9         if (mCache.size() > MAXSIZE_CACHE) {
10             if (null != mHandler) {
11                 mHandler.post(new Runnable() {
12
13                     @Override
14                     public void run() {
15                         if (!isSending) {
16                             // 写日志到文件
17                             pushToFile();
18                             // 发送日志到服务端
19                             sendActionToServer();
20                         }
21                     }
22                 });
23             }
24         }
25     }

用户行为记录

在监听到用户操作的时候调用记录方法,先将信息存入缓存,当缓存到达阀值时,清空缓存并写入文件。

 1     /**
 2      * 写入文件
 3      */
 4     private void pushToFile() {
 5         String logs = "";
 6         // 组装信息
 7         for (String str : mCache) {
 8             logs += str + "\n";
 9         }
10         // 清空缓存日志
11         mCache.clear();
12         File file = new File(userActionFilePath);
13         if (!file.exists()) {
14             try {
15                 file.createNewFile();
16             } catch (IOException e) {
17                 e.printStackTrace();
18             }
19         }
20         BufferedWriter writer = null;
21         try {
22             writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
23             writer.write(logs + "\n");
24         } catch (Exception e) {
25             e.printStackTrace();
26         } finally {
27             if (null != writer) {
28                 try {
29                     writer.close();
30                 } catch (IOException e) {
31                     // TODO Auto-generated catch block
32                     e.printStackTrace();
33                 }
34             }
35         }
36     }

写入日志文件

 1     private void sendActionToServer() {
 2         if (!isSending && null != mHandler) {
 3             mHandler.post(new Runnable() {
 4
 5                 @Override
 6                 public void run() {
 7                     if (isSending) {
 8                         return;
 9                     }
10                     File temp = new File(userActionFilePath);
11                     if (null != temp) {
12                         long length = temp.length();
13                         if (length > MAXSIZE_FILE_CACHE) {
14                             // 文件大于阀值,删除文件,重置重试次数
15                             retryCount = 0;
16                             return;
17                         }
18                         if (length > SIZE_FILE_CACHE && retryCount >= 3) {
19                             // 文件大小大于设置值并失败次数大于3次,删除文件重置重试次数
20                             retryCount = 0;
21                             return;
22                         }
23                         // 开始发送服务
24                         isSending = true;
25                         new Thread(new Runnable() {
26
27                             @Override
28                             public void run() {
29                                 if (sendService()) {
30                                     // 发送服务成功,清空文件内容
31                                     retryCount = 0;
32                                 } else {
33                                     // 发送服务失败,增加重试次数
34                                     retryCount++;
35                                 }
36                                 // 服务发送完毕,重置标记位
37                                 isSending = false;
38                             }
39                         }).start();
40                     }
41                 }
42             });
43         }
44     }

发送日志服务

以上代码在文件大小大于阀值时会删除了文件,在发送服务次数到达了3次后删除文件。

 

转载于:https://www.cnblogs.com/derson2388/p/4071851.html

Android平台的用户行为记录解决方案相关推荐

  1. android 网络wifi定位服务器,基于位置指纹算法的Android平台WiFi定位系统

    近年来,随着城域无线基础网络的发展,热点(AP)的覆盖范围已大大增加. 由于对定位服务的需求增加以及WiFi应用的扩展,WiFi定位已成为一种有效的定位方法. GPS卫星定位是最重要的定位方法. 它需 ...

  2. Https/Tcp抓包工具Charles、fiddler,ping (网络诊断工具),Android平台HTTPS抓包解决方案及问题分析HttpCanary

    市面上已经有一些弱网络模拟工具,比如微软的Network Emulator for Windows Toolkit(NEWT),Facebook的Augmented Traffic Control(A ...

  3. oracle 被另一用户锁定,Oracle报错记录被另外一个用户锁定的解决方案

    原因 当一个用户对数据进行修改时,若没有进行提交或者回滚,Oracle不允许其他用户修改该条数据,在这种情况下修改,就会出现:"记录被另外一个用户锁定"错误. 解决 查询用户.数据 ...

  4. 基于Android平台的多分辨率解决方案[图]

    为什么80%的码农都做不了架构师?>>>    摘要:近年来,智能手机的功能越来越强大,移动终端应用程序层出不穷,移动互联网改变人们的生活.Android系统是开放手机联盟推出的一款 ...

  5. Android平台阿里云安全解决方案总结

    Android平台阿里云安全解决方案总结 阿里聚安全目前提供了安全扫描.安全组件.应用加固.安全审计.安全测试工具五种方案. 一.安全扫描 将APP提交到阿里服务器上,然后由阿里服务器进行安全扫描发现 ...

  6. Unity发布Android平台错误记录

    Unity发布Android平台错误记录 (1)Cannot parse project property android.enableR8='' of type 'class java.lang.S ...

  7. librtmp开源库与android平台编译记录

    一.编写目的 为了记录编译librtmp开源库过程遇到的问题,帮助后来人提供参考,希望本文能为大家提供参考. 二.简介(官方介绍) The Real-Time Messaging Protocol ( ...

  8. 基于android平台的语音机器人服务娱乐系统

    分 类 号:TP311 学校代码:11460 学 号:10130920 本科生毕业论文 基于android平台的语音机器人服务娱乐系统 Robot Entertainment Service Syst ...

  9. 移动平台端到端低成本解决方案

    移动平台端到端低成本解决方案 1. 概述 <移动平台End-2-End低成本解决方案>一课,描述的是当今移动互联网大局背景下,如何低成本的为移动应用搭建一个低成本服务端.从而实现中小开发者 ...

最新文章

  1. Linux环境下命令行截图【转】
  2. @Autowire 和 @Resource 注解使用的正确姿势,别再用错的了!!
  3. impala连接使用方法
  4. Android自动化测试之Robotium学习(二)
  5. 云服务器 web网站吗,web云服务器免费的吗
  6. Linux运行脚本忽略警告,ShellCheck - 显示Shell脚本的警告和建议的工具
  7. mysql字符串用法
  8. Django04-2: ORM关系表\字段补充
  9. ubuntu 串口调试工具_开源软件分享基于WPF的串口调试工具
  10. vrep和simulink联合仿真
  11. Faster RCNN论文详解
  12. 信息奥赛一本通1196:踩方格
  13. ubuntu将电源键设置为关机
  14. 外卖也智能!美团骑手智能助手的技术与实践
  15. 3月15日 | 开启 ICLR 2023预讲会专场二
  16. 2021最新整理JAVA常见面试题附答案
  17. ElasticSearch 命令
  18. opencv python gpu加速_在Windows上使用OpenCV和Python进行硬件加速解码(MSMT/IntelMFX/FFMPEG/any-backend)...
  19. 北大4位数学天才,如今齐聚美国搞科研,令人叹息
  20. Android修改系统中默认字体大小

热门文章

  1. jedis连接池详解(Redis)
  2. cocos2d-x 3.X (二)创建动起来的精灵
  3. Linux常用命令备忘(启动管理、文件或目录管理、系统管理)
  4. C#实现WEB服务器
  5. JDK1.7 深入理解 LinkedHashMap
  6. (79)FPGA复位激励(initial)
  7. System verilog随机系统函数$random使用方法
  8. 2021-03-10 模板扩展类调用模板基类成员函数
  9. python时间控件遮罩层_jquery遮罩层插件
  10. phoneinfo界面翻译_phone info +下载-三星验机神器phone info samsung下载v3.6.4 安卓版-西西软件下载...