我想在android中每小时获取一次位置。为此,我使用报警管理器并为每小时设置重复报警,只想在修复时间之后写入文件,即上午8点和下午12点。 我在设置报警管理器时出现问题,而我每隔一小时设置一次,但是在1/2小时内执行。
on button click i start service :
serviceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent(AutoMainActivity.this, TrackerService.class);
pendingIntent = PendingIntent.getService(AutoMainActivity.this, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, ALARM_TRIGGER_AT_TIME,
3600000, pendingIntent);
//3600000 1hrs
finish();
}
});
服务类如下:
Tracker Service.class
String FINAL_STRING;
SharedPreferences pref;
static final int START_TIME = 8;
static final int MID_TIME = 12;
java.util.Date systemDates = Calendar.getInstance().getTime();
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if(hour == START_TIME)
{
edit.putString("smsdata", FINAL_STRING);
edit.commit();
//sendSms(START_TAG+pref.getString("smsdata", ""));
edit.putString("smsdata", "");
edit.commit();
}else {
System.out.println("currentdate:"+simpleDateFormat.toString());
System.out.println("current_time:"+currentTime);
Editor edit = pref.edit();
edit.putString("smsdata", pref.getString("smsdata", "")+FINAL_STRING+"#");
edit.commit();
if(hour==MID_TIME)
{
//sendSms(START_TAG+pref.getString("smsdata", ""));
generateNoteOnSD("\n"+START_TAG+pref.getString("smsdata", ""));
edit.putString("smsdata", "");
edit.commit();
System.out.println("mid time");
}
}
当我执行此操作时,服务每30分钟开始一次。但我想每60分钟一次。
答案 0 :(得分:1)
首先,您确实希望使用其中一个可用的常量,例如INTERVAL_HOUR
和setInexactRepeating()
。
其次,setInexactRepeating()
不准确。 Android保留灵活处理警报时间的权利,以便将事件与其他预定的不准确警报联合起来。
因此,请尝试简要切换到setRepeating()
。如果它现在按预期工作,那么您的行为归因于setInexactRepeating()
的“不精确”性质。
此外,您可以使用 adb shell dumpsys alarm
来检查预定的闹钟。可能是您安排了两个警报,每个警报每小时一次。
答案 1 :(得分:1)
setInexactRepeating()是它无法按预期工作的原因。请尝试以下方法:
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, firstStart, interval, pendingIntent );