我为android创建一个闹钟应用程序,出于某种原因,总有一些东西在我的报警中延迟20-60秒。我不知道为什么它使用setExact()方法的API发生作为即时通讯19+报警应用程序不准确
我的代码:
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'是之前,现在的情况下(例如,它刚刚在我所在的地方变成了中午,因此,从0到11的'mHour'是过去的)。除此之外,您正在测试的确切硬件是什么,以及如何测试它?请记住,许多设备(包括所有运行的Android 6.0+)都具有可以忽略或延迟某些AlarmManager定时事件以节省电池的功能。 – CommonsWare