app轮询,单例,监控

遇到一个这样的需求,就是检测用户是否在线,脑袋一时闪过很多中想法,开启服务,用子线程进行轮询调用接口,或者利用极光推送的长连接等等,问了一下有经验的大神,才知道做轮询其实很简单。由于这个任务是跟随着用户打开app之后一直进行的,我只需要在第一个act(一般是mainact)调用onCreate方法的时候开始检测,在最后一个act(一般也是mainact)退出的时候终止任务,根据需求,这个任务应该是一个唯一的,所以设计成单例模式

package com.example.base.basetemplate.Statistics;

import android.app.ActivityManager;
import android.content.Context;
import android.os.Handler;
import android.util.Log;

import com.example.base.basetemplate.base.MyEnvironment;

import java.util.List;

/**
 * Created by cgx on 2017-6-19.
 */

public class StatisticsManager {
    volatile private static StatisticsManager instance;
    private static Object lock = new Object();
    private Handler mHandler = new Handler();
    private int mScheduleTime = 2;//2秒刷一次
    private boolean stoped = true;

    private StatisticsManager() {
    }

    public static StatisticsManager getInstance() {
        if (null == instance) {
            synchronized (lock) {
                if (null == instance) {
                    instance = new StatisticsManager();
                }
            }
        }
        return instance;
    }

    private Runnable task = new Runnable() {
        public void run() {
            if (isForeground(MyEnvironment.activity())) {
                onSchedule();
            }
            mHandler.postDelayed(task, mScheduleTime * 1000);
        }
    };

    /**
     * 开始轮询统计任务
     */
    public void start() {
        if (!stoped) {
            return;
        }
        mHandler.removeCallbacks(task);
        mHandler.post(task);
        onStart();
        stoped = false;
    }

    /**
     * 结束轮询统计任务
     */
    public void stop() {
        if (isForeground(MyEnvironment.activity())) {
            return;
        }
        onStop();
        mHandler.removeCallbacks(task);
        stoped = true;
    }

    /**
     * 执行轮询任务
     */
    private void onSchedule() {
        Log.e("lunxun", "轮询中:"+ System.currentTimeMillis());
    }

    /**
     * 开始任务的时候需要进行的首次统计任务
     */
    private void onStart() {
        Log.e("lunxun","start");
    }

    /**
     * 终止任务的时候,执行的任务
     */
    private void onStop() {
        Log.e("lunxun","stop");
    }

    public static boolean isForeground(Context context) {
        if (context != null) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : processes) {
                if (processInfo.processName.equals(context.getPackageName())) {
                    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND ||
                            processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE
                            ) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

思路非常清晰,在mainact的onResume()方法中开始检测任务

StatisticsManager.getInstance().start();

在mainact的onStop方法中结束检测任务

StatisticsManager.getInstance().stop();

如果在开启/结束检测任务的时候需要进行额外的统计需求,可以在

StatisticsManager 的onStart()和onStop()方法中实现,

轮询的代码可以在onSchedule()方法中执行

转载于:https://my.oschina.net/carbenson/blog/915499

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值