0

我想在 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 分钟一次。

4

2 回答 2

1

setInexactRepeating() 是它无法按预期工作的原因。尝试以下操作:

AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, firstStart, interval, pendingIntent );
于 2013-05-09T11:54:49.363 回答
1

首先,您确实想使用其中一个可用的常量,例如INTERVAL_HOUR, with setInexactRepeating()

setInexactRepeating()不准确。Android 保留调整警报时间以将事件与其他预定的不准确警报合并的权利。

因此,请尝试短暂切换到setRepeating(). 如果它现在按您的预期工作,那么您的行为是由于setInexactRepeating().

此外,您可以使用adb shell dumpsys alarm来检查计划的警报。可能您安排了两个闹钟,每个闹钟每小时响一次。

于 2013-05-09T11:34:51.790 回答