使用AlarmManager来实现定时任务

2017-05-18  本文已影响0人  seawaveai

#使用的情景:


     App有测量功能,测量后把数据保存到Sqlite里,要实现把测量的数据上传到服务器。一般有两种处理方式:1. 用户点击按钮后,实现数据上传到服务器   2. 实现自动上传数据到服务器。

#效果


每隔五秒会请求一次

只要在连网了的情况下,每隔五秒就会去查询数据,看是否有新的数据,如果有就会把数据查询出来,转成Json上传到服务器。

#代码


PollingUtils

PollingUtils启动和关闭定时任务。


-------------------------------------------------------------------------------------------

Service

Service开启服务,在服务里面的线程执行你需要的逻辑。


-------------------------------------------------------------------------------------------

启动

在合适的地方启动定时任务。这里有四个参数:第一个参数---上下文,第二个参数---设置时间间隔,第三个参数---执行任务的服务,第四个参数---服务的Aciton(标志)。


#实现步骤:

1.在MainActivity启动:

PollingUtils.startPollingService(this,5,PollingService.class,PollingService.ACTION);

2.PollingUtils工具类:

public classPollingUtils {

private staticAlarmManageralarmManager;

//开启轮询服务

public static voidstartPollingService(Context context, intseconds,Class cls,String action) {

LogUtils.i("PollingUtils","==Start polling service...");

//获取AlarmManager系统服务

alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

//需要执行Service的Intent

Intent intent =newIntent(context,cls);

intent.setAction(action);

PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//触发服务的起始时间

longtriggerAtTime = SystemClock.elapsedRealtime();

//使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,triggerAtTime,seconds *1000,pendingIntent);

}

//停止轮询服务

public static voidstopPollingService(Context context,Class cls,String action) {

LogUtils.i("PollingUtils","==Stop polling service...");

alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Intent intent =newIntent(context,cls);

intent.setAction(action);

PendingIntent pendingIntent = PendingIntent.getService(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//取消正在执行的服务

alarmManager.cancel(pendingIntent);

}

}

3.服务PollingService

public classPollingServiceextendsService {

 public static finalStringACTION="com.hbxz.qkys.protocol.PollingService";

 privateGsonmGson;

privateStringmMachineNo;

@Override

publicIBinderonBind(Intent intent) {

return null;

}

@Override

public voidonCreate() {

if(mGson==null) {

mGson=newGson();

}

}

@Override

public voidonStart(Intent intent, intstartId) {

mMachineNo= (String) SharedPreferencesHelper.getData( UIUtils.getContext(),"MachineNo",SerialPortComm.MACHINENO);

newPollingThread().start();

}

intcount=0;//作为上传数据是否正在运行的标志,1代表正在执行

classPollingThreadextendsThread {

@Override

public void run() {

BaseApplication app = (BaseApplication) UIUtils.getContext();

//1.如果上传数据没正在运行,就要开启;

//2.如果已经执行,就不要开启.

if(app.isConnectWifi&&count==0) {//Wifi开启和count=0就执行.

count++;//此时count就大于0了.

try{

queryDataTotal();

}catch(Exception e) {

count=0;//出错的情况

e.printStackTrace();

}

}

}

}

上一篇下一篇

猜你喜欢

热点阅读