【发布时间】:2011-05-16 01:53:26
【问题描述】:
我需要定期检查数据更新,但数据只在白天更新,所以我希望这个重复动作只在那个时间段运行,以节省电池和带宽。
我该怎么办?
【问题讨论】:
我需要定期检查数据更新,但数据只在白天更新,所以我希望这个重复动作只在那个时间段运行,以节省电池和带宽。
我该怎么办?
【问题讨论】:
如果服务通过 HTTP get/post/whatever 请求与云通信,请注意C2DM 解决方案可以延长电池寿命,SyncAdapter 解决方案可以提供一些好处。 (我建议观看有关这两个主题的 Google I/O 视频。)
以下代码的功能与您最初询问的内容接近。
public class MyUpdateService extends IntentService
{
public MyUpdateService()
{
super(MyUpdateService.class.getSimpleName());
}
@Override
protected void onHandleIntent(Intent intent)
{
// Do useful things.
// After doing useful things...
scheduleNextUpdate();
}
private void scheduleNextUpdate()
{
Intent intent = new Intent(this, this.getClass());
PendingIntent pendingIntent =
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// The update frequency should often be user configurable. This is not.
long currentTimeMillis = System.currentTimeMillis();
long nextUpdateTimeMillis = currentTimeMillis + 15 * DateUtils.MINUTE_IN_MILLIS;
Time nextUpdateTime = new Time();
nextUpdateTime.set(nextUpdateTimeMillis);
if (nextUpdateTime.hour < 8 || nextUpdateTime.hour >= 18)
{
nextUpdateTime.hour = 8;
nextUpdateTime.minute = 0;
nextUpdateTime.second = 0;
nextUpdateTimeMillis = nextUpdateTime.toMillis(false) + DateUtils.DAY_IN_MILLIS;
}
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent);
}
}
【讨论】:
DateTime nextUpdateTime = DateTime.now().plusMinutes(15);
按照这些简单的步骤,让 servce 在 android 设备中永远存在。 1. 每 15 分钟使用警报管理器调用一次服务。 2. 在 onStart 方法中返回 START_STICKY。 3.在销毁时调用警报管理器并使用重新启动服务 启动服务方法。 4.(可选)在 onTaskRemoved 方法中重复第 3 点。
【讨论】: