(二)仅仅通过Application监听用户行为及App的在线状态和在线时长

  先要实现功能,还是先从API去找。看看有没有你想要的。这里其实就是监听App内activity的状态。怎么办?

  给个API所在地址:http://www.android-doc.com/reference/android/app/Application.html

  

看到没?这里有个方法registerActivityLifecycleCallbacks ,这不是监听吗?看看回调了啥东西,点进去再看看。

我去,这服务不要太好呀。要啥有啥。看到没?所有activity的生命周期都能获取到。所以。怎么用就成了改考虑的问题了。

下面是我做的统计活跃量和时长的

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by admin on 2018/3/2.
 * @author  cxx
 * note: 根据activity的生命周期来判断用户的操作。在两种情况下结束app计时统计。
 * 一种是:当处于栈顶或顶层的activity被挂起,要强制杀掉进程的时候。
 * 二种是:当用户逐层退回到最底层的activity,并finish的时候。即:清空activity栈结束app
 */

public class TimeRecord {

    private boolean isAppAlive = true;  //判断app计时是否已经结束,如果结束,但是app并没有被杀掉,用此字段复活计时功能
    private boolean isSwitchActivity = false;
    private boolean isAppExit = false;

    private String topActivity ;
    private MetaClass helper ;
    private Map<String ,String> map = new HashMap<>();
    private long timeStart =0;   //开始计时的时间戳

    private String TAG = "cxx";

    public void init(final Context context,MetaClass metaClass){
        Application application  = (Application)context.getApplicationContext();

        //上报活跃量
       System.out.println(TAG+"上报活跃量——初始化");
        this.helper = metaClass;
        helper.reportActive();

        timeStart = System.currentTimeMillis()/1000;
       System.out.println(TAG+"开始计时——初始化"+timeStart);

        application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                topActivity = activity.getClass().getSimpleName();
                map.put(topActivity,topActivity);
                isAppAlive = true;
                isSwitchActivity = false;
               System.out.println(TAG+"Created_activity:"+activity.getClass().getSimpleName());
            }

            @Override
            public void onActivityStarted(Activity activity) {
               System.out.println(TAG+"Started_activity:"+activity.getClass().getSimpleName());
            }

            @Override
            public void onActivityResumed(Activity activity) {
               System.out.println(TAG+"Resumed_activity:"+activity.getClass().getSimpleName());

                if(!activity.getClass().getSimpleName().equals(topActivity)){
                    isSwitchActivity = true;
                }else{
                    isSwitchActivity = false;
                }
                topActivity=activity.getClass().getSimpleName();

                if(!isAppAlive||isAppExit){
                    isAppExit = false;
                   System.out.println(TAG+"上报活跃量——onResumed");
                    helper.reportActive();

                    timeStart = System.currentTimeMillis()/1000;
                   System.out.println(TAG+"开始计时——onResumed"+timeStart);
                    isAppAlive = true;
                }
            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            public void onActivityStopped(Activity activity) {
               System.out.println(TAG+"stop_activity:"+activity.getClass().getSimpleName());
               System.out.println(TAG+"stop_topActivity:"+topActivity);
                if(topActivity.equals(activity.getClass().getSimpleName())){
                    if(!isSwitchActivity){
                        long timeEnd = System.currentTimeMillis()/1000;
                        if(helper!=null){
                            long timegap = timeEnd-timeStart;
                            String onlineTime = String.valueOf(timegap);
                           System.out.println(TAG+"计时结束——stopped:"+timeEnd);
                           System.out.println(TAG+"计时结束时长——stopped:"+onlineTime);
                            helper.reportOnline(onlineTime);
                        }
                        isAppAlive=false;
                    }

                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                map.remove(activity.getClass().getSimpleName());
                if(map.size()==0&&isAppAlive){
                    long timeEnd = System.currentTimeMillis()/1000;
                    if(helper!=null){
                        long timegap = timeEnd-timeStart;
                        String onlineTime = String.valueOf(timegap);
                       System.out.println(TAG+"计时结束——destory:"+timeEnd);
                       System.out.println(TAG+"计时结束时长——destory:"+onlineTime);
                        helper.reportOnline(onlineTime);
                    }
                    isAppAlive = false;
                }
                if(map.size() ==0){
                    isAppExit = true;
                }
            }
        });
    }

}

原文地址:https://www.cnblogs.com/shoneworn/p/8527650.html

时间: 2024-11-29 03:15:57

(二)仅仅通过Application监听用户行为及App的在线状态和在线时长的相关文章

11双向数据绑定和监听用户的输入

双向数据绑定 方向一:将数据绑定到视图 方向二:将视图用户操作的结果 绑定到 数据 语法:<input   type=" "       [(ngModule)] = " "> ①必须指定模块 依赖于 表单模块(ngModule指令并不属于ng核心模块的,属于表单模块) 在app.module.ts中,引入表单模块 import {FormsModule} from '@angular/forms' ②在数据的元数据 imports 数组中指定表单模块的

Android开发之EditText 详解(addTextChangedListener监听用户输入状态)

为了实现像qq或者微信输入框的效果,当在 EditText输入字符串时发送按钮显示,当输入框字符消除掉时按钮改变.所以这时候我就要用到addTextChangedListener 用它来监听用户输入状态.可以在监听中改变用户输入的内容或者提示用户输入内容不合法等等 EditText editText = (EditText)findViewById(R.id.monitor_edit_text0); editText.addTextChangedListener(new TextWatcher(

Spring Boot实现一个监听用户请求的拦截器

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } //这

微信小程序监听用户上滑下滑事件

今天做了一个要根据用户上滑或者下滑来显示不同内容的功能. 思路:先监听用户是上滑还是下滑,监听到结果后改变data数据中用来判断模块显示隐藏的变量,两个需要切换的模块使用两个hidden,data中定义两个变量来接受更改后的true或者false 页面 hidden='{{bottom}}' hidden='{{top}}' data{ //初始化状态 top:true, bottom:false, } //判断浏览器滚动条上下滚动 if (t.scrollTop > a.data.scroll

scala实战之spark用户在线时长和登录次数统计实例

接触spark后就开始学习scala语言了,因为有一点python和java的基础学习起来还行,今天在这里把我工作中应用scala编程统计分析用户行为日志的实例和大家分析一下,我这里主要讲一下用户的在线时长统计和登录次数统计算法实现过程. 第一步 编程环境:首先你得有spark安装包 你可以先不用本地安装spark,但是可以通过import spark-assembly-1.6.2-hadoop2.6.0.jar包来完成程序调试 另外需要scala的运行环境,我用的版本:scala-sdk-2.

js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长

html: <!doctype html><html><head><meta charset="utf-8"><title>记录用户的在线时长</title></head> <body></body></html><script type="text/javascript"> var Statistics_Website_logo ={

pyHook监听用户鼠标、键盘事件

一.代码部分:获取用户输入信息,并与截图一起保存到XX目录下 # -*- coding: utf-8 -*- # import pythoncom import pyHook    import time import socket from PIL import ImageGrab # #如果是远程监听某个目标电脑,可以自己架设一个服务器,然后将获取到的信息发回给服务器 # def send_msg_to_server(msg):     host=""     port=1234

Libgdx之监听用户输入

做游戏的最重要的是要与用户有交互,怎样与用户交互Ligdx提供了2种方式. Libgdx事件查询(Event Polling) 这种方式主要是Libgdx主动查询当前的状态,通过这种方式我们可以查询键盘输入,鼠标事件,加速器等状态 事实上主动查询事件是在render()方法中调用,意味每一帧我们都会来查询事件状态. 在Libgdx上我们可以获得屏幕点击坐标 Gdx.input.getX() 和 Gdx.input.getY(),注意这时获取的坐标为Touch坐标,我们要通过函数camera.un

监听用户的访问的链接

需求: 监听一个链接的访问来源 1.存储到数据库 2.存储到文件(写入文件) 3. reids 缓存 class UrlMsgAnalyze{ public function checkUrl($url){ if( empty($url) ){ return false; } return true ; } public function insertUrlMsgAnalyze($url ){ if(!$this->checkUrl($url )){ return ; } $insertData