通过警报创建重复服务

时间:2013-08-11 20:11:55

标签: android android-service android-alarms

我尝试在我的应用中创建一项服务,每天下午2点更新数据。我想设置一个重复警报,触发服务为我提取数据。这与UI线程无关,即使应用程序关闭也应该有效。

我似乎无法启动我的服务。

以下是我在活动中创建警报的代码

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 20); // HOUR
    cal.set(Calendar.MINUTE, 0); // MIN
    cal.set(Calendar.SECOND, 0); // SEC
    Intent intent = new Intent(Main.this, VenueUpdater.class);
    PendingIntent pintent = PendingIntent.getService(Main.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

然后我的服务类

public class VenueUpdater extends Service{

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "Create", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onCreate");
}

@Override
public void onDestroy() {
    Toast.makeText(this, "Destroy", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onDestroy");
}

@SuppressWarnings("deprecation")
@Override
public void onStart(Intent intent, int startid) {
    super.onStart(intent, startid);
    Toast.makeText(this, "Start", Toast.LENGTH_SHORT).show();
    Log.i("SERVICE", "onStart");
}

}

在关闭我的应用程序标记

之前和我的Manifest中
 <service android:enabled="true" android:name="services.VenueUpdater" />

</application>

我已经检查了一些其他的示例和代码,我已经使用了服务,代码看起来很好,但仍然不起作用。此外,我想知道是否有更好的方法来实现这一点,因为相同的警报可能最终被创建多次,但可能有一个待处理的意图标志,我可以用来检查它没有。

2 个答案:

答案 0 :(得分:4)

您已将闹钟设置为晚上8点,而不是下午2点:

cal.set(Calendar.HOUR_OF_DAY, 20); // HOUR

如果您想确保多次安排闹钟,可以在设置闹钟之前取消之前安排的所有闹钟,如下所示:

alarm.cancel(pintent);

此外,此次致电AlarmManager

alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);

将闹钟设置为晚上8点,然后每30秒一次。这就是你想要的吗?

编辑显示如何将警报设置为每天下午2点重复一次

要安排闹钟在每天下午2点重复一次,请使用:

alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pintent);

答案 1 :(得分:0)

1)在Service子类中使用onStartCommad方法启动所有服务例程。不是onStart / onCreate。 2)以下是我的AndroidManife示例:

<service android:name=".service.AlertService" />

3)PendingIntent如果使用相同的requestCodegetService方法的第二个参数)并且使用标记PendingIntent.FLAG_UPDATE_CURRENT,则会覆盖前一个(即重叠alam)作为最后一个参数。

试试吧。