Как установить два разных прослушивателя сигналов тревоги WakefulIntentService?

Я использую WakefulIntentService Commonsware (https://github.com/commonsguy/cwac-wakeful) для запуска периодического задания в моем приложении для Android (обновление кеша изображений). Пока все хорошо, но я хочу добавить другой WakefulIntentService, чтобы выполнять другую работу с другим интервалом времени.

Я не уверен, смогу ли я это сделать и как. На данный момент я планирую будильник следующим образом:

WakefulIntentService.scheduleAlarms(new CacheAlarmListener(), mContext, true);

Реализация CacheAlarmListener такова:

@Override
public void scheduleAlarms(AlarmManager alarmManager, PendingIntent pendingIntent, Context context) {
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60000, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
}

@Override
public void sendWakefulWork(Context context) {
    WakefulIntentService.sendWakefulWork(context, CacheRefreshService.class);
}

Просматривая исходный код, getListener(Context) из AlarmReceiver похоже находит и запускает один AlarmListener. Я ошибаюсь, или есть другой способ запланировать будильник или установить другой PendingIntent?

В принципе, я хотел бы иметь возможность зарегистрировать новый, отдельный AlarmListener, или хотя бы иметь возможность выяснить, на какой WakefulIntentService отправить работу, в методе sendWakefulWork(Context).


person Corneliu Dascălu    schedule 19.02.2013    source источник


Ответы (1)


Пока все хорошо, но я хочу добавить другой WakefulIntentService, чтобы выполнять другую работу.

Вам не нужно этого делать. Один WakefulIntentService может выполнять несколько действий в зависимости от разных характеристик Intent (например, строк действий, дополнений). Наличие нескольких реализаций WakefulIntentService в одном и том же проекте не проверено — и, если кто-то не сможет убедить меня в его необходимости, не поддерживается.

метод getListener(Context) из AlarmReceiver, кажется, находит и запускает один AlarmListener. Я ошибся

Нет, ты прав.

есть ли другой способ запланировать будильник или установить другой PendingIntent?

Следуйте инструкциям "Основное использование" в файле README проекта.

или хотя бы понять, в какой WakefulIntentService отправить работу

Пожалуйста, только один WakefulIntentService.

Мне нужно иметь возможность запускать две разные службы.

Пожалуйста, только один WakefulIntentService.

person CommonsWare    schedule 19.02.2013
comment
Благодарю вас! Полностью согласен, одного сервиса достаточно, но я не вижу возможности изменить какую-либо Intent характеристику без модификации кода метода WakefulIntentService.scheduleAlarms(AlarmListener,Context,boolean). Есть ли другой способ? - person Corneliu Dascălu; 19.02.2013
comment
Я могу легко добавить некоторые дополнения к Intent, созданному внутри этого метода, но я не хочу изменять ваш код без необходимости. В любом случае, спасибо вам большое, и спасибо за большую работу, которую вы делаете. - person Corneliu Dascălu; 19.02.2013
comment
@CorneliuDascălu: Пожалуйста, нажмите на гиперссылку в моем ответе и прочитайте этот раздел. Это объясняет, как вы можете использовать WakefulIntentService без scheduleAlarms(). - person CommonsWare; 19.02.2013
comment
Хорошо, моя ошибка. Я уже прочитал README. Мне было интересно, есть ли способ использовать scheduleAlarms() с различными дополнениями Intent, но я думаю, что его нет. Я понимаю, что могу сделать свою собственную реализацию, которая позаботится об установке будильника, я просто пытался этого избежать. - person Corneliu Dascălu; 19.02.2013
comment
@CorneliuDascălu: мне было интересно, есть ли способ использовать scheduleAlarms() с различными дополнительными функциями Intent, но я думаю, что их нет - ну, scheduleAlarms() сам по себе не имеет ничего общего с дополнительными функциями Intent. Однако у вас может не быть простого способа отличить разные сценарии, в которых вызывается scheduleAlarms(). Вот уж действительно для простых аварийных сценариев, а вы переборщили с простыми :-). - person CommonsWare; 19.02.2013
comment
Я потихоньку стал это осознавать :). Спасибо за помощь. - person Corneliu Dascălu; 19.02.2013
comment
Привет, я просто хочу добавить, что провел большую часть пасхальных выходных, работая над базовой версией службы намерения бодрствования, затем перешел к фактической реализации нескольких будильников и увидел последнюю версию с расписанием будильников и начал впадать в депрессию. что я зря потратил все это время и мне придется переделывать все свои будильники. так что я просто хочу подтвердить, Марк, что если я хочу настроить несколько будильников, лучше всего просто использовать вашу простую / базовую версию без прослушивателя сигналов тревоги / расписания сигналов тревоги? - person Russ Wheeler; 04.04.2013
comment
Да, и кстати, спасибо за этот бодрящий материал, это действительно полезно - person Russ Wheeler; 04.04.2013
comment
@RussWheeler: если я хочу настроить несколько будильников, лучше всего просто использовать вашу простую / базовую версию без прослушивателя будильника / расписания будильника? -- наверное. Мой AlarmListener предназначен для простых сценариев. спасибо за то, что делаете этот бодрящий материал, это действительно полезно - добро пожаловать! - person CommonsWare; 04.04.2013
comment
Последняя вещь. Вы говорите о простых сценариях, но технически возможно ли с помощью AlarmListener создавать несколько сигналов тревоги? если да, то мне просто интересно, как? Будет ли это означать переписывание/добавление базовых классов? В какой машине лучше не связываться с твоим основным кодом. - person Russ Wheeler; 04.04.2013
comment
О, и спасибо за быстрый ответ на не совсем свежий вопрос - person Russ Wheeler; 04.04.2013
comment
@RussWheeler: Вы говорите, что это простые сценарии, но возможно ли с технической точки зрения создавать несколько тревог с помощью AlarmListener? -- наверное, не без модификаций. Будет ли это означать переписывание/добавление базовых классов? -- наверное. - person CommonsWare; 04.04.2013
comment
Хорошо, спасибо за ваш ответ. О, если бы я когда-нибудь выпустил то, над чем работал, что именно мне пришлось бы делать под лицензией apache (для меня все это немного юридическое/техническое) - person Russ Wheeler; 04.04.2013
comment
@RussWheeler: Извините, но это выходит за рамки StackOverflow. В Интернете есть множество материалов, объясняющих, как применять различные лицензии с открытым исходным кодом. - person CommonsWare; 05.04.2013
comment
Почти уверен, что есть сценарии, в которых мне понадобится несколько WakefulIntentServices. Прямо сейчас я хочу, чтобы две разные задачи выполнялись в разные промежутки времени, как мне это сделать с помощью всего одного WakefulIntentService? - person ln e; 10.11.2013
comment
@lne: есть только один WakefulIntentService. Настройте два тревожных события с помощью AlarmManager с разными Intent дополнительными функциями. Используйте оператор if(), основанный на этих дополнениях, для перехода к соответствующей части кода внутри doWakefulWork(). Довольно просто. - person CommonsWare; 10.11.2013
comment
@CommonsWare Как мне передать Intent + extras? WakefulIntentService.scheduleAlarms(), кажется, не принимает ожидающие намерения в своих аргументах? Я несколько смущен. - person ln e; 10.11.2013
comment
@lne: следуйте инструкциям по базовому использованию и запланируйте свои собственные будильники: github.com/commonsguy/ cwac-wakeful#базовое-использование - person CommonsWare; 10.11.2013