我尝试在我的应用中创建一项服务,每天下午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>
我已经检查了一些其他的示例和代码,我已经使用了服务,代码看起来很好,但仍然不起作用。此外,我想知道是否有更好的方法来实现这一点,因为相同的警报可能最终被创建多次,但可能有一个待处理的意图标志,我可以用来检查它没有。
答案 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
如果使用相同的requestCode
(getService
方法的第二个参数)并且使用标记PendingIntent.FLAG_UPDATE_CURRENT
,则会覆盖前一个(即重叠alam)作为最后一个参数。
试试吧。