您的位置:首页 > 移动开发 > Android开发

后台统计初学篇

2017-05-14 16:39 92 查看

近期应市场和产品需求,公司开发的一款后台统计的项目,主要功能类似百度统计和友盟统计的统计篇章,当然作为移动端的我做的主要是基于java开发android端的应用(即开发成jar包导入应用中使用)。

接下来是开发中的步骤说明:

1. 空的应用打成jar包的方法

2. 开发中代码的接入与使用

一、项目创建与jar包生成方法

1. 应用软件Android Studio 创建项目

a. 先创建一个空的应用,创建后在项目中新建一个module,选择Android Library,如下图:



b. 新建的module记得在app中关联,如下图:



2.生成jar包的方法

a. 在module中的build.gradle中加入生成jar包的代码,如下代码(我的完整的build):

apply plugin: 'com.android.library'

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
minSdkVersion 10
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//Copy类型
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/mysdk.jar'
//设置拷贝的文件
from('build/intermediates/bundles/release/')
//打进jar包后的文件目录
into('build/libs/')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
//(我们只关心classes.jar这个文件)
include('classes.jar')
//重命名
rename('classes.jar', 'mmb_sdk.jar')
}

makeJar.dependsOn(build)
//在终端执行生成JAR包
// gradlew makeJar
//android {    useLibrary 'org.apache.http.legacy'}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:support-v4:24.1.1'
compile 'com.android.support:design:24.1.1'
compile 'com.google.code.gson:gson:2.8.0'
}


b. 在终端生成jar包的方法

在Terminal中键入 gradlew makeJar , 运行后最终结果:

在module的libs中会生成对应的jar包文件(此路径在上面代码的into方法中可以更改)

二、后台统计代码开发步骤

1.单例模式的开始和结束

创建单例模式的方式让引入了该jar包的app可以直接调用这2个方法来执行应用的进入和退出,代码如下:

方法中所跟参数皆为后台统计所需,可根据需要进行更改

public class StartServiceMMB {
private static String TAG = "StartServiceMMB";
public StartServiceMMB() {
}

public static synchronized void onPageStartMMB(String post_hostURL,Context var0, Application application,String event,String memberId,String KeyWords,String method,String productId,String way){
if(var0 != null && !TextUtils.isEmpty(SystemInfo.getImei(var0))) {
JsonStringUtils.login(post_hostURL,"2", SystemInfo.getImei(var0),SystemInfo.getAppName(var0,application),SystemInfo.getVersionCode(var0,application),SystemInfo.getModelType(var0),event,memberId,KeyWords,method,productId,way);
Log.i(TAG,"*******onPageStart=");
Log.i(TAG,"*******System.currentTimeMillis()=" + System.currentTimeMillis());
}else {
Log.i(TAG,"onPageStart :parame=null || empty");
}
}

public static synchronized void onPageEndMMB(String post_hostURL,Context var0, Application application,String event,String memberId,String KeyWords,String method,String productId,String way){
if(var0 != null && !TextUtils.isEmpty(SystemInfo.getImei(var0))) {
JsonStringUtils.login(post_hostURL,"2", SystemInfo.getImei(var0),SystemInfo.getAppName(var0,application),SystemInfo.getVersionCode(var0,application),SystemInfo.getModelType(var0),event,memberId,KeyWords,method,productId,way);
Log.i(TAG,"*******onPageEnd=");
Log.i(TAG,"*******System.currentTimeMillis()=" + System.currentTimeMillis());
}else {
Log.i(TAG,"onPageEnd :parame=null || empty");
}
}
}


2.了解后台统计中的必传参数(所有必传参数用单例获取)

* 客户端调用的方法:传递参数向服务器中发送请求

* @param type          类型(1是iPhone,2是Android)
* @param imei          设备号(没有则不发起请求)
* @param appName       app名字
* @param versionCode   应用的版本号
* @param modelType     手机型号
* @param event         事件类型
* @param memberId      未登录传空、否则登录


3.了解后台统计中的选传参数

* @param keyWords         关键字
*  @param method         发起方式(同一种来自不同的界面的发起)
*  @param productId         商品ID
*  @param way         在线时长(way = 1 应用的启动或进入前台, way = 2 应用结束或进入后台)


4.app的不同界面对应的不同的event事件

String post_hostURL————————————app测试或线上url
Context var0———————————————————
Application application————————
String event———————————————————1~7,对应不同的界面
String memberId————————————————未登录或登录
String KeyWords————————————————首页获取关键字或者搜索框中输入的内容
String method——————————————————同一种来自不同的界面的发起
String productId———————————————商品ID
String way—————————————————————在线时长的统计


[b]1. 引导页[/b]

引导页为app首次启动才会出现的,事件event = 1,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,this,this.getApplication(),"1","","","","","");


[b]2. 欢迎页[/b]

欢迎页为app每次启动都会出现的,事件event = 2,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,this,this.getApplication(),"2",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","","","");


[b]3. 搜索框的内容搜索[/b]

首页搜索框中输入内容后点击搜索发起,事件event = 3,method = 1,keyWord = ”输入的内容“,其他参数置“” (暂时未填)

关键字key需要转码:

key = URLDecoder.decode(channelIdTemp.substring(9,channelIdTemp.length()),”UTF-8”);

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,getActivity(),getActivity().getApplication(),"3",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),key,"1","","");


[b]4. 首页关键字[/b]

首页关键字的点击发起,事件event = 3,method = 2,keyWord = ”点击的关键字“,其他参数置“”

关键字key需要转码:

key = URLDecoder.decode(channelIdTemp.substring(9,channelIdTemp.length()),”UTF-8”);

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,getActivity(),getActivity().getApplication(),"3",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),key,"2","","");


[b]5. 商品详情页[/b]

商品详情页的进入,事件event = 4,productId = “商品的ID”,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,this,getApplication(),"4",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","",prtId,"");


[b]6. 商品详情页中的单品收藏(关注)[/b]

商品详情页的商品关注,事件event = 5,method = 1 , productId = “商品的ID”,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,getActivity(),getActivity().getApplication(),"5", SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","1",prtId,"");


[b]7. 加入进货单[/b]

商品详情页 加入进货单的点击,事件event = 5,method = 2 , productId = “商品的ID”,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,getActivity(),getActivity().getApplication(),"5",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","2",prtId,"");


[b]8. 立即购买[/b]

商品详情页 立即购买的点击,事件event = 5,method = 3 , productId = “商品的ID”,其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,getActivity(),getActivity().getApplication(),"5",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","3",prtId,"");


[b]9. 商品详情页的客服[/b]

商品详情页的客服,事件event = 6,method = 1 , 其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,ctx.get(),application,"6", SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","1","","");


[b]10. 店铺页的客服[/b]

店铺页的客服,事件event = 6,method = 2 , 其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,this,this.getApplication(),"6",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","2","","");


[b]11. 订单列表的客服[/b]

订单列表的客服,事件event = 6,method = 3 , 其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,ctx.get(),application,"6", SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","3","","");


[b]12. 订单详情的客服[/b]

订单详情的客服,事件event = 6,method = 4 , 其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,this,getApplication(),"6",
SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","4","","");


[b]13. 在线时长–前台[/b]

事件event = 7,way = 1 , 其他参数置“”

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,activity,activity.getApplication(),"7",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","","","1");


[b]14. 在线时长–后台[/b]

事件event = 7,way = 2 , 其他参数置“”

a. 接电话、锁屏

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,activity,activity.getApplication(),"7",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","","","2");


b. 连续2次退出键退出应用

StartServiceMMB.onPageStartMMB(ApplicationGlobal._appUrl,SysmainActivity.this,getApplication(),"7",SystemInfo.getInstance(MMBApplication.getInstance().getApplicationContext()).getMemberid(),"","","","2");


延伸:

统计时长中我们会发现,应用在处于前台时,当前Activity一定调用了onResume方法,而应用进入后台时,当前Activity一定调用了onStop方法。

如:

1).当Activity A跳转到Activity B,A和B的生命周期变化经历了如下一个过程:

A onPause ——> B onCreate ——> B onStart ——> B onResume ——> A onStop


此时的应用应该处于前台运行状态,所以,正确的方式应该是在onStart里面发起进入前台的请求,在onStop的方法里发起进入后台的请求,从而统计出时长。

上述这种间隔问题主要考虑到诸如消息推送这场景下的一个应用前后台状态的判断,而在手势密码这种使用场景下,无需考虑,也可以在其他生命周期方法中处理,只需要在onResume方法中判断是否需要展示解锁解界面。

2).应用进入后台再回到前台时,当前Activity生命周期的变化过程如下,通常往往容易忽视在onRestart之后的onStart方法:

onPause ——> onStop ——> onRestart ——> onStart ——> onResume


未完待续 … …
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息