如何安排Android服务以固定速率执行

时间:2014-01-06 11:10:11

标签: android android-service

我正在开发一个应用程序,应该每隔X秒从网络下载一个文件以检查是否有任何更改,我使用服务来执行此操作,但其执行并未通过延迟时间率修复,这是我的代码服务:


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    checkUpdate();
    return START_STICKY;
}

private Void checkUpdate() {
    timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Log.i("Service", String.valueOf(++counter));
                if(Helper.isNetworkAvailable(getBaseContext())) {
                      // download file
                } else {
                        Log.e("ServiceHandler", "Couldn't get any data from the url");
                    }
                }else {
                    Log.e("Connection", "No connection");
                }
            }
        }, 10000, 10000);
    return null;
}

输出不固定,应该每隔10秒运行一次,同时以随机方式运行服务

4 个答案:

答案 0 :(得分:2)

如何在IntentService中设置AlarmManager?更加准确。

 Intent intent = new Intent(context, YourClass.class);
 PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);
 AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
 am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 10*1000, pi);

确保在YourClass.class(这是一个IntentService)中,将你的逻辑放在handleIntent(Intent intent)中,它将由AlarmManager发送的PendingIntent每10秒调用一次。

P.S。更新您的清单

希望有所帮助

答案 1 :(得分:0)

使用AlarmManager类代替Timer Class。它还执行您想要的相同重复任务。 AlamrManager重量轻,即使您的设备处于睡眠模式,它也会运行。

另请参阅此链接Android:How to repeat a service with AlarmManager

答案 2 :(得分:0)

  

对于重复性工作,android提供了简单的api,称为Timer请查看。使用起来非常简单。

答案 3 :(得分:0)

试试这个:

@Override
      public void onStart(Intent intent, int startId) {

          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);

            Log.d("Internet Available:  ", ""+flag);

            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.SECOND, 10);

            Intent intent1 = new Intent(this, UpdateWidgetServiceDemo.class);

            PendingIntent pintent = PendingIntent.getService(this, 0, intent1, 0);

            AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            int i;
            i=15;

            alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);


        super.onStart(intent, startId);
      }

删除return START_STICKY;