【问题标题】:Alarm app is not accurate报警应用程序不准确
【发布时间】:2016-01-07 01:08:20
【问题描述】:

我正在为 android 创建一个闹钟应用程序,出于某种原因,我的闹钟总是会有 20-60 秒的延迟。我不知道为什么会发生这种情况,因为我正在使用 API 19+ 的 setExact() 方法

我的代码:

private void setAlarm() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mHour = mTimePicker.getHour();
        mMinutes = mTimePicker.getMinute();
    } else {
        mHour = mTimePicker.getCurrentHour();
        mMinutes = mTimePicker.getCurrentMinute();
    }

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, mHour);
    calendar.set(Calendar.MINUTE, mMinutes);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent alarmIntent = new Intent(EditAlarm.this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(EditAlarm.this, 0, alarmIntent, 0);


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    }

}

报警接收器

public class AlarmReceiver extends WakefulBroadcastReceiver {

public AlarmReceiver() {
}

@Override
public void onReceive(final Context context, Intent intent) {

    Toast.makeText(context, "Alarm works", Toast.LENGTH_LONG).show();
    Intent alarmIntent = new Intent(context, AlarmActivity.class);
    alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(alarmIntent);
}

报警活动

public class AlarmActivity extends AppCompatActivity {
private Vibrator mVibrator;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alarm);
    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


    // The ringing effects
    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null) {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    Ringtone ringtone = RingtoneManager.getRingtone(this, alarmUri);
    ringtone.play();
    mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
    long[] pattern = { 0, 300, 200, 300, 100, 100 };
    mVibrator.vibrate(pattern, 0);

    // UI
    Button stopButton = (Button) findViewById(R.id.finishButton);
    stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                    mVibrator.cancel();
                    finish();
        }
    });
}

我做错了什么?在此先感谢 ;)

【问题讨论】:

  • 首先,请注意您的Calendar 代码有一个错误,因为您没有处理mHour 之前的情况(例如,它刚刚变成我所在的中午,所以mHour 0 到 11 是过去)。除此之外,您正在测试的确切硬件是什么,您如何测试它?请记住,许多设备(包括所有运行 Android 6.0+ 的设备)都具有忽略或延迟某些 AlarmManager 计划事件以节省电池的功能。

标签: android android-intent alarmmanager android-alarms


【解决方案1】:

要解决此问题,您还需要设置秒数。您需要将其设置为零以在指定的分钟到达时触发它:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, mHour);
calendar.set(Calendar.MINUTE, mMinutes);
calendar.set(Calendar.SECOND, 0);

【讨论】:

  • 谢谢,我完全忘了秒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2017-06-23
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多