为什么我的 Android AlarmManager 代码不能正常工作?
Why is my Android AlarmManager code not working properly?
我的应用程序中有闹钟:
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.curentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 11);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = Pending.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
}
}
这是我的AlarmReceiver.class
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println("ALARM: " + sdf.format(new Date()));
}
}
在我的 AndroidManifest.xml 中有这条线
<receiver android:name=".main.AlarmReceiver" />
问题是闹钟在我设置的时间不响。我为
设置了闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 5);
然后在11:11:29
报警。然后我设置闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 20);
然后在11:26:29
报警。然后我设置闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 29);
然后闹钟在11:41:29
报警。
就这样持续了一上午。但是,如果我替换此行
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
用这条线
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime()+10000), pendingIntent);
然后报警器在合适的10秒内完美报警
这是怎么回事?
根据文档,setInexactRepeating 在设计上并不准确。为了通过多次唤醒设备来减少电池消耗,它会在内部尝试同时触发多个警报,从而导致某些客户端的警报时间不准确。
https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,%20long,%20long,%20android.app.PendingIntent)
我的应用程序中有闹钟:
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.curentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 11);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = Pending.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
}
}
这是我的AlarmReceiver.class
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println("ALARM: " + sdf.format(new Date()));
}
}
在我的 AndroidManifest.xml 中有这条线
<receiver android:name=".main.AlarmReceiver" />
问题是闹钟在我设置的时间不响。我为
设置了闹钟calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 5);
然后在11:11:29
报警。然后我设置闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 20);
然后在11:26:29
报警。然后我设置闹钟
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(MINUTE, 29);
然后闹钟在11:41:29
报警。
就这样持续了一上午。但是,如果我替换此行
alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntente);
用这条线
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, (SystemClock.elapsedRealtime()+10000), pendingIntent);
然后报警器在合适的10秒内完美报警
这是怎么回事?
根据文档,setInexactRepeating 在设计上并不准确。为了通过多次唤醒设备来减少电池消耗,它会在内部尝试同时触发多个警报,从而导致某些客户端的警报时间不准确。 https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,%20long,%20long,%20android.app.PendingIntent)