1

我尝试在我的应用程序中创建一项服务,以便每天下午 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");
}

}

在我关闭应用程序标签之前的清单中

 <service android:enabled="true" android:name="services.VenueUpdater" />

</application>

我检查了其他一些我使用过服务的示例和代码,这些代码似乎很好,但仍然无法正常工作。另外我想知道是否有更好的方法来实现这一点,因为同一个警报可能最终会被创建多次,但可能有一个待定意图标志我可以用来检查它是否没有。

4

2 回答 2

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);
于 2013-08-11T20:42:03.513 回答
0

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

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

3)如果它使用相同的(方法的第二个参数)并且flag用作最后一个参数,PendingIntent它将永远重叠前一个(即重叠alam) 。requestCodegetServicePendingIntent.FLAG_UPDATE_CURRENT

试试看。

于 2013-08-11T20:25:44.173 回答