遇到一个这样的需求,就是检测用户是否在线,脑袋一时闪过很多中想法,开启服务,用子线程进行轮询调用接口,或者利用极光推送的长连接等等,问了一下有经验的大神,才知道做轮询其实很简单。由于这个任务是跟随着用户打开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()方法中执行