我有一个从AlarmManager
设置运行的服务,定期记录传感器数据。
我遇到一个问题,每次启动/运行应用程序时,打开应用程序都会在onCreate
中执行该服务。所以我实现了以下内容以确保它只在它的间隔运行:
Intent intent = new Intent(getApplicationContext(), Service.class );
AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//Boolean to see if alarm is already set:
alarmUp = (PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_NO_CREATE) != null);
//make pending intent to schedule
PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (runOnce == false){
if (!alarmUp){
Log.d("alarmUp", "= false");
scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, 900000, 900000, scheduledIntent);
}
runOnce = true;
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(RUN_ONCE, runOnce);
editor.commit();
}
//Alarm Manager schedule Start Service:
if (alarmUp){
Log.d("alarmUp", "= true");
// 15 min intervals = 900000
//scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 900000, scheduledIntent);
scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, 900000, 900000, scheduledIntent);
}
我引入了runOnce
布尔值,因为getBroadcast
要么总是在运行服务,要么在全新安装应用程序时根本不启动它。这是解决方案,但会导致出现新问题 - 打开和关闭设备后,服务将无法再次启动。
我该如何解决这个问题?我可以找到另一种方法来启动服务,而不会太频繁地运行,或者检查设备上次关闭时重置runOnce布尔值?
感谢您的任何建议。
答案 0 :(得分:2)
我该如何解决这个问题?
使用ACTION_BOOT_COMPLETED
BroadcastReceiver
重启后重新安排闹钟,如this sample project所示。 AlarmManager
预定事件在重启后无法生存,因此您必须自己重新建立它们。
顺便说一句,我建议您在上面显示的代码中用getApplicationContext()
替换this
。当您知道为什么在特定情况下应该使用getApplicationContext()
时,才使用getApplicationContext()
。