Вместо того чтобы оставлять Service
работающим в фоновом режиме все время (если только он постоянно не работает!), Вам, вероятно, следует подумать о регистрации тревоги в ОС, которая будет вызывать вашу службу через определенные промежутки времени и затем отпускатькогда закончите, вернитесь в спящий режим.
Это упростит вашу реализацию Service
и избавит вас от большинства проблем, связанных с синхронизацией.Вы также получите преимущество в том, что если ваш Service
потерпит крах или по какой-либо причине погибнет, таймер будильника вернет его на следующий цикл.
Способ работает, создав BroadcastReceiver
, которыйпрослушивает определенный Intent
, который вы зарегистрировали на Android AlarmManager
.
Какой вариант вы выберете, во многом будет зависеть от того, насколько велики ваши интервалы, поскольку передача сигнала тревоги намного дороже, чем ожидание по таймеру.Если вы хотите выполнять свою работу каждые несколько секунд, таймер, вероятно, лучше.Если ваше время ожидания измеряется в минутах или часах, включите сигнализацию.
Сначала вам нужно будет создать сигнализацию.
PendingIntent pi = PendingIntent.getService(context, 0, yourIntent, yourFlags);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setInexactRepeating(AlarmManger.ELAPSED_REALTIME, // Alarm type
5000, // Time before first alarm
AlarmManager.INTERVAL_HOUR, // Alarm interval
pi); // Sent when alarm happens
Чтобы фактически использовать сигнализацию,Вы должны слушать это, чтобы уйти.Для этого вам нужно создать BroadcastReceiver
.
public class SnoozeButton extends BroadcastReceiver {
public void onReceive (Context context, Intent intent) {
if (thisIntentIsTheOneIWant(intent){
context.startService(intent);
}
}
private boolean thisIntentIsTheOneIWant(Intent intent) {
// Test here to make sure this intent is for your app
// and service. You may get Intents other than what
// you are interested in.
}
}
Обратите внимание, что вы должны объявить свой BroadcastReciever
в своем AndroidManifest.xml
.