Сигнализация Android и сервисный триггер - PullRequest
0 голосов
/ 27 февраля 2012

Пара вопросов по регистрации тревоги и запуску сервиса по триггеру.

  1. Если будильник установлен на пару минут раньше текущего времени, а затем, если телефон отключен, сработает ли будильник на следующем телефоне по истечении установленного времени?

  2. Как отменить / обновить ожидающие намерения в обслуживании? Как получить код запроса в startCommand() методе обслуживания?

  3. Будет ли создано несколько экземпляров службы, если сигнал тревоги активируется через каждые 10 секунд?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012
  1. Сохраните время будильника в SharedPreferences. Затем зарегистрируйте получатель для android.intent.action.BOOT_COMPLETED (не забывая добавить разрешение для android.permission.RECEIVE_BOOT_COMPLETED к вашему манифесту), а затем в приемнике, который будет запускаться при запуске, вы можете увидеть, есть ли сигнал тревоги в SharedPreferences, и если это так, вы можете сбросить его, если он еще не прошел, или решить, что делать, если время уже прошло.

  2. См. проблема с отменой ожидающего намерения менеджера аварий

  3. Нет. Сервис onCreate будет вызываться только один раз. Его onStart и onStartCommand будут вызываться каждый раз.

1 голос
/ 27 февраля 2012
  1. Если «выключить» означает полное отключение питания, а не просто «один раз коротко нажать кнопку питания для выключения экрана», ответ «нет»

  2. Я думаю, что вы не можете получить код запроса вообще.Как указано в документации по getService , поле requestCode в настоящее время не используется.Вы должны передать все свои данные с помощью Intent (третий аргумент getService).

  3. Не будет.См. http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)

Каждый вызов этого метода приведет к соответствующему вызову метода onStartCommand (Intent, int, int) целевой службы

0 голосов
/ 04 апреля 2013
  1. Из моего собственного приложения, которое я разрабатываю, если будильник установлен на время, когда телефон выключен, он был запущен при следующем включении / загрузке телефона. Это без получателя для присутствия BOOT_COMPLETED. Я не уверен, является ли это ожидаемым поведением или нет, или оно является последовательным по телефонным вариантам.

    Я полагаю, что если вы хотите, чтобы ваша сигнализация выполняла намерение в указанное время, вам нужно использовать getBroadcast PendingIntent с WakeLock, поскольку другие варианты PendingIntent не гарантируют, что телефон будет оставаться активным достаточно долго, прежде чем он выключится. снова. Это информация из другого поста CommonsWare, которую я постараюсь найти и сослаться на нее.

  2. Я полагаю, что вы можете удалить отложенный запрос, отправленный диспетчеру аварийных сигналов, используя, например, такую ​​функцию:

    public void unregisterEvent(PendingIntent sender) { ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(sender); }

    где PendingIntent был создан в точности как исходное намерение, которое вы пытаетесь удалить. Вы можете обновить его, указав правильный идентификатор вместе с новым PendingIntent при повторном вызове AlarmManager:

    AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

    Это то, что я использую для создания / перестройки PendingIntent:

    PendingIntent.getService(this, uniqueIndexToIntent, theIntentItself, PendingIntent.FLAG_UPDATE_CURRENT);

    Флаг обновит намерение, если оно уже существует, или создаст новое, в противном случае.

  3. Не думаю, что так и будет. Тем не менее, я бы порекомендовал, чтобы ваш сервисный вызов stopSelf () завершил свою работу, чтобы минимизировать использование батареи. Не нужно его запускать, если он не имеет ничего общего!

...