使用AlarmManager来实现定时任务

#使用的情景:


     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();

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、鸡汤 appwidget是android中小组件,我们经常说的widget其实是指的那些button、text...
    欢乐斗佛阅读 2,316评论 1 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,198评论 19 139
  • 我记得我开始使用轮询是在做直播项目的时候,当时是在直播间中用来做弹幕的功能的。 在android中可以实现轮询的方...
    Orz013阅读 5,485评论 0 7
  • 立冬过后,天气一天天凉起来了,早晚温差有些大,早晨需要穿件薄线衫,中午还有些暖洋洋的,到了晚上起风了又会觉得阵阵凉...
    五月的荷阅读 364评论 11 10
  • 《琅琊榜》这套书买回来将近快一年了,一直放在那没有动。前几天实在找不到实体书了,就准备把《琅琊榜》再看一看。虽然已...
    冷冷123456阅读 348评论 0 4