使用AlarmManager来实现定时任务
#使用的情景:
App有测量功能,测量后把数据保存到Sqlite里,要实现把测量的数据上传到服务器。一般有两种处理方式:1. 用户点击按钮后,实现数据上传到服务器 2. 实现自动上传数据到服务器。
#效果
每隔五秒会请求一次
只要在连网了的情况下,每隔五秒就会去查询数据,看是否有新的数据,如果有就会把数据查询出来,转成Json上传到服务器。
#代码
PollingUtils
PollingUtils启动和关闭定时任务。
-------------------------------------------------------------------------------------------
ServiceService开启服务,在服务里面的线程执行你需要的逻辑。
-------------------------------------------------------------------------------------------
启动在合适的地方启动定时任务。这里有四个参数:第一个参数---上下文,第二个参数---设置时间间隔,第三个参数---执行任务的服务,第四个参数---服务的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();
}
}
}
}
}