2016-07-07 1 views
1

My ReminderService использует AlarmManager, чтобы информировать пользователя о предстоящем событии в определенное время. Возможно ли, что AlarmManager сообщает тот же сервис (ReminderService), или мне нужно запустить другой сервис, чтобы поймать ожидающее намерения? До сих пор этот механизм выглядит как этотУстановите будильник в сервисе и получите обратный вызов в той же службе

public class ReminderService extends Service { 

    // ... 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     // .. 

     /* When the alarm goes off the NotifyService will be started. Is it possible to inform **this** 
      service (ReminderService) and to handle the alarm? */ 
     Intent alarmIntent = new Intent(this, NotifyService.class); 
     alarmIntent.putExtra(TodoTask.PARCELABLE_KEY, task); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     PendingIntent pendingIntent = PendingIntent.getService(this, 0, alarmIntent, 0); 

     Calendar calendar = Calendar.getInstance(); 
     Date date = new Date(reminderTimeStamp*1000); 
     calendar.setTime(date); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } 
} 

ответ

0

есть u жестяная банка. Вам просто нужно изменить эту строку:

Intent alarmIntent = new Intent(this, NotifyService.class); 

к этому:

Intent alarmIntent = new Intent(this, ReminderService.class); 

этак ReminderService получит намерение с TodoTask.PARCELABLE_KEY внутри этого же метода public int onStartCommand(Intent intent, int flags, int startId)

Помните, что нет никаких гарантий, что это будет тот же самый экземпляр службы. Если служба, которую вы запускаете, будет убита системой, новый экземпляр ее начнет обрабатывать намерение.

Также помните все вещи режима сна и доз, упомянутые Ларри_Шифером по его ответу.

+0

Отлично, но означает ли это, что на самом деле я не могу хранить данные в своем сервисе, потому что всегда возможно, что служба будет убита. Поскольку мне нужно делать некоторые запросы к базе данных, нужно ли их повторять каждый раз в onStartCommand? – null

+0

Служба получает 'onCreate()' и 'onDestroy()' обратные вызовы, которые вы можете использовать для проверки состояния. Так что да, если вам нужны данные, необходимые для загрузки и сохранения. – Budius

0

Вы можете использовать один и тот же Service (или другой компонент), чтобы получить сигнал. Тем не менее, не то, что ваш сигнал тревоги не будет гарантированно доставлен по расписанию при малой мощности. Используйте WakefulReceiver или свою комбинацию BroadcastReceiver и wakelock, чтобы получить Service. См. this article для получения дополнительной информации о состоянии питания и аварийных сигналах.

Также обратите внимание, что, начиная с Android Marshmallow, ваши wakelocks будут игнорироваться, если устройство находится в режиме «Дозировка». Есть и другие вещи, которые вам придется сделать, чтобы разбудить устройство в определенное время, когда в Doze.