Android AlarmManager.setRepeating()未在正确的时间重复
我正在尝试制作一个原型应用程序,其中AlarmManager需要重复(比如,每5秒钟)执行某些操作。它会重复我的BroadcastReceiver的onReceive()方法中的任何代码执行,但它会在1分钟内重复某些内容,即使它应该每5秒钟重复一次。我已经完成了所有的教程,我很确定我已经完成了所有的步骤。有人能帮忙找出为什么每次都这么晚吗 AlarmRecurrence.javaAndroid AlarmManager.setRepeating()未在正确的时间重复,android,android-alarms,Android,Android Alarms,我正在尝试制作一个原型应用程序,其中AlarmManager需要重复(比如,每5秒钟)执行某些操作。它会重复我的BroadcastReceiver的onReceive()方法中的任何代码执行,但它会在1分钟内重复某些内容,即使它应该每5秒钟重复一次。我已经完成了所有的教程,我很确定我已经完成了所有的步骤。有人能帮忙找出为什么每次都这么晚吗 AlarmRecurrence.java public class AlarmRecurring extends AppCompatActivity
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()。这对我帮助很大。我找不到它被记录在哪里,但它似乎是一个真正的最低限度。