Java 为什么AlarmManager火灾不一致
我正在我的MainActivity.java(程序启动的主要活动)的Java 为什么AlarmManager火灾不一致,java,android,android-alarms,Java,Android,Android Alarms,我正在我的MainActivity.java(程序启动的主要活动)的onResume()状态中注册报警管理器 但是,我得到的结果不一致,以下代码运行良好,没有错误,它表明pendingent应每10分钟触发一次,但结果如下所示,例如,来自logcat的: 它开始运作良好: 2:00 pm (fired), 2:10 pm (fired), 2:30 pm (fired), ... 但过了一段时间: 3:20 pm (fired), 3:27 pm (fired), 3:33 pm (fired
onResume()
状态中注册报警管理器
但是,我得到的结果不一致,以下代码运行良好,没有错误,它表明pendingent
应每10分钟触发一次,但结果如下所示,例如,来自logcat的:
它开始运作良好:
2:00 pm (fired), 2:10 pm (fired), 2:30 pm (fired), ...
但过了一段时间:
3:20 pm (fired), 3:27 pm (fired), 3:33 pm (fired), 3:38 pm (fired) ...
问题是
在活动的哪个生命周期最好注册一个AlarmManager
,如果我所做的是正确的,那么不一致运行的原因是什么 您的onResume
在这些时间会被调用,因此会触发警报,并再次将其设置为接下来的十分钟
如果您的最终结果是在报警时调用某个功能,请尝试在那里设置下一个报警,在创建MainActivity时调用您的报警一次。(检查第一次运行,使用文件
获取相同的或仅使用共享首选项
)让触发报警时运行的服务/功能/代码来处理其余部分
流程将类似于:
MainActivity-->onCreate-->检查是否首次运行-->是-->注册报警并立即执行-->调用函数/代码-->让此代码设置下一个报警。使用它为我工作的以下代码: 1-
private SharedPreferences优先权代码>
二,-
三,-
说明:
使用SharedReferences
保存布尔值AlARM\u SET
,简单而精确,即使手机重新启动或关机,此代码也能正常工作。AlarmManager
的文档明确指出重复报警是不精确的,因此您可以通过Logcat观察到漂移
注:自API 19起,所有重复报警均不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并按上述方式重新安排每次的时间。targetSdkVersion早于API 19的传统应用程序将继续将其所有报警(包括重复报警)视为精确报警
您可以使用的代码块:
public void schedule(final Context context) {
int alarmCode = YOUR_ALARM_CODE;
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
final Calendar calendar = yourCalendar();
final AlarmManager alarm = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
final long time = calendar.getTimeInMillis();
alarm.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}
这对于setInexactRepeating是正确的,SetRepeating应该可以正常工作,并且可以预期达到API级别18。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Launch SharedPreferences
prefs = getSharedPreferences("Alarm", MODE_PRIVATE);
protected void onResume() {
super.onResume();
if(!prefs.getBoolean(Helper.ALARM_SET, false)) {
Intent intent = new Intent(this, NewsIntentService.class);
PendingIntent pi = PendingIntent.getService(this, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
10 * 60 * 1000, pi);
Log.i(Helper.ALARM_SET, "Alarm is set.");
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(Helper.ALARM_SET, true);
editor.commit();
}
}
public void schedule(final Context context) {
int alarmCode = YOUR_ALARM_CODE;
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
final Calendar calendar = yourCalendar();
final AlarmManager alarm = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
final long time = calendar.getTimeInMillis();
alarm.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}