Android AlarmManager.setRepeating()未在正确的时间重复

Android AlarmManager.setRepeating()未在正确的时间重复,android,android-alarms,Android,Android Alarms,我正在尝试制作一个原型应用程序,其中AlarmManager需要重复(比如,每5秒钟)执行某些操作。它会重复我的BroadcastReceiver的onReceive()方法中的任何代码执行,但它会在1分钟内重复某些内容,即使它应该每5秒钟重复一次。我已经完成了所有的教程,我很确定我已经完成了所有的步骤。有人能帮忙找出为什么每次都这么晚吗 AlarmRecurrence.java public class AlarmRecurring extends AppCompatActivity

我正在尝试制作一个原型应用程序,其中AlarmManager需要重复(比如,每5秒钟)执行某些操作。它会重复我的BroadcastReceiver的onReceive()方法中的任何代码执行,但它会在1分钟内重复某些内容,即使它应该每5秒钟重复一次。我已经完成了所有的教程,我很确定我已经完成了所有的步骤。有人能帮忙找出为什么每次都这么晚吗

AlarmRecurrence.java

    public class AlarmRecurring extends AppCompatActivity {

  private PendingIntent pendingIntent;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_alarm_recurring);
    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
    setupButtons();

  }

  private void setupButtons()
  {
    findViewById(R.id.stopRepeating).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        cancel();
      }
    });
    findViewById(R.id.startRepeating).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        startrepeating();
      }
    });

  }


  public void cancel() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    manager.cancel(pendingIntent);
    Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show();
  }

  public void startrepeating() {
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    EditText secondsToRepeat =(EditText) findViewById(R.id.secondsToRepeat);
    int repeat = Integer.parseInt(secondsToRepeat.getText().toString());

        /* Repeating on every 20 minutes interval */
    TimePicker tp = (TimePicker) findViewById(R.id.timePicker);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, tp.getCurrentHour());
    calendar.set(Calendar.MINUTE, tp.getCurrentMinute());
    manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            1000 * repeat, pendingIntent);

    Toast.makeText(this, "Repeating Alarm Started at every: " + repeat + "secs", Toast.LENGTH_SHORT).show();
  }
AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
    MediaPlayer mp=null;

    @Override
    public void onReceive(Context context, Intent intent) {
        // For our recurring task, we'll just display a message
        Toast.makeText(context, "Repeating Alarm running at:" + new Date().toString(), Toast.LENGTH_SHORT).show();

        mp = MediaPlayer.create(context , R.raw.short_notice);
        mp.start();
    }
}

谢谢:-)

从API 22开始,如果给定值较小,则间隔值将强制高达60000毫秒。

存在一些android targetsdkversion

从API 19(KITKAT)开始,警报传递不正确:

安卓操作系统将切换警报,以尽量减少唤醒和电池使用。Te Os提供了新的API来支持需要严格交付保证的应用程序

  • 设置窗口(int、long、long、pendingent)

  • setExact(整型、长型、悬挂型)


targetSdkVersion早于API 19的应用程序将继续看到以前的行为,即所有警报都会在请求时准确发送。

您是否100%确定要注册每5秒运行一次警报?用你发的代码我不能确定。还要注意此[链接](,long,long,android.app.pendingent))中的注释,并尝试修改您的代码以使用一次性报警。@JanithaR嗯,一旦我使用AlarmManager.setrepeating(),它应该在执行时正确设置报警。我正在使用一个广播接收器,它正在正常执行。因此,它确实设置了警报,但只是没有及时跟踪准确度。很抱歉,我刚刚意识到我之前发布的链接有点混乱。“注意:从API 19开始,所有重复警报都是不精确的。如果应用程序需要精确的传递时间,则必须使用一次性精确警报,并按上述方式重新安排每次时间。targetSdkVersion早于API 19的旧版应用程序将继续将其所有警报(包括重复警报)视为精确警报。”你知道这一点吗?谢谢,我刚刚切换到另一个组件一段时间,当我开始执行严格的警报调度时,我将不得不使用setWindow()。这对我帮助很大。我找不到它被记录在哪里,但它似乎是一个真正的最低限度。