美文网首页
使用AlarmManager来实现定时任务

使用AlarmManager来实现定时任务

作者: seawaveai | 来源:发表于2017-05-18 11:21 被阅读0次

    #使用的情景:


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

    }

    }

    }

    }

    相关文章

      网友评论

          本文标题:使用AlarmManager来实现定时任务

          本文链接:https://www.haomeiwen.com/subject/jghsxxtx.html