2014-01-20 2 views
1

У меня есть приложение, в котором пользователь может создавать несколько обратных отсчетов. У каждого есть свое имя, время для подсчета, мелодия звонка и т. Д.Android: Как заставить несколько CountdownTimers работать на фоне?

Я расширил CountDownTimer, чтобы провести каждую настройку тревоги и создал диспетчер Singleton для управления всеми аварийными сигналами.

Все работает нормально, пока я не покину App.

Счетчики на самом деле не умирают. У них странное поведение. После запуска счетчика: 1) если я нажимаю клавишу «Назад» до главного экрана, а затем выключает экран, сигнал тревоги будет срабатывать так, как должен. 2) если я нажму кнопку «домой», а затем выключите экран, он будет срабатывать только при открытии приложения. 3) Если я просто выключу экран, пока все еще в приложении, он активируется, как только я включу экран. Я ожидал неприятностей, потому что для такого рода вещей мне нужно использовать Службы, Обработчики или другие подобные вещи.

Проблема в том, что я новичок в Android и после многого прочитал об этом, я не смог найти решение.

Насколько я понял, я должен использовать Службы, но может иметь только один экземпляр. Как я буду работать с несколькими сигналами тревоги?

Есть ли другой способ сделать это?

Мне нужен способ запускать каждый аварийный сигнал и сообщать системе, что нужно следить за тем, что происходит! (и называть деятельность, когда она заканчивается)

Любая помощь?

+0

Работа с одним CountDownTImer, сигналы тревоги будут в разное время, каждый раз, когда таймер обратного отсчета будет состязаться, проверьте следующий доступный сигнал тревоги и запустите таймер обратного отсчета для следующего сигнала. –

+0

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

ответ

4

Есть ли другой способ это сделать?

Если ваша цель состоит в том, чтобы предупредить пользователя о событиях в будущем, независимо от того, работает ли приложение, сбросить все ваши CountdownTimer логику, и переключиться на AlarmManager. Он специально разработан для такого рода сценариев. Вы можете настроить событие AlarmManager для каждого таймера, чтобы получить контроль, когда достигнуто конечное время.

отметить также, что вам нужно будет хранить информацию о ваших зарегистрированных событий в файл или базу данных:

  • , так что пользователи могут добавлять и удалять их, и

  • так что вы можете настроить AlarmManager снова, если пользователь перезагружает их устройство

и созывать активность, когда это фи nishes

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

+0

Они простые таймеры обратного отсчета. Мне нужно показать тикающие часы для каждого, и если пользователь уходит от таймеров или приложений, они должны продолжать работать и предупреждать пользователя, когда он заканчивается. (и если пользователь вернется к таймерам, им нужно продолжать тикать). Исправьте меня, если я ошибаюсь, но AlarmManager, похоже, предназначен для планирования фоновых операций, и я не могу «пометить» часы с ним. Мне нужны визуальные таймеры обратного отсчета, которые предупреждают пользователя, если он истекает, когда он не смотрит. – Dpedrinha

+0

Счетчики на самом деле не умирают. У них странное поведение. После запуска счетчика 1), если я нажмю клавишу до тех пор, пока на главном экране и не выключится экран, будильник будет срабатывать по мере необходимости. 2) если я нажимаю кнопку «домой», то выключите экран, который он вызывается, только если я открою приложение. 3) если я просто выключу экран, пока все еще в приложении, он активируется, как только я включу экран. – Dpedrinha

+0

@ Dpedrinha, если вы хотите проверить, действительно ли они не умирают, тогда начните открывать тяжелые приложения, такие как: камера (сделайте несколько фотографий), затем откройте веб-браузер (откройте несколько вкладок с сайтами), затем откройте программу просмотра PDF, а затем, возможно, Kindle (если вы используйте его), сделайте несколько телефонных звонков, ... Ваше приложение в конечном итоге будет убито, но ... если он действительно очень маленький, то андроид может продлить свою жизнь - чтобы написать надежные приложения, вы должны подчиняться системным правилам, которые просты, 'будьте готовы к тому, что ваше приложение будет убито в любое время'. – marcinj

0

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

Все, что вам нужно сделать, - это просто указать целевое время в какую-то коллекцию или событие, помещенное в View.setTag().

Затем у вас есть таймер (скажем, 1-й тик) - на каждом тике вы должны перебирать все ваши датчики, проверять целевое время и текущее время, анализировать номер и настраивать калибр.

Однако, поскольку таймеры работают над отдельными (не главными) потоками, вам придется использовать обработчик или что-то в этом роде. Если вы хотите просто установить некоторые сигналы тревоги - ответьте на CommonsWare - это хорошо.

+0

Проблема в том, что это не решает основной проблемы: «Все работает нормально, пока я не покину приложение». Как только приложение не находится на переднем плане, процесс может быть прерван в любое время, взяв с собой экземпляры «CountdownTimer». – CommonsWare

+0

Вы правы - установка IntentService с помощью простого метода getNearestAlarm() внутри будет лучше. С другой стороны, я все еще удивляюсь, как причудливые методы люди могли найти, чтобы не читать некоторые базовые компоненты Android. – piotrpo

+0

Я считаю, что этот подход был бы слишком сложным для моего сценария. Может быть, я не понимаю. Это типичный набор часов обратного отсчета. Пользователь может создать столько таймеров обратного отсчета, сколько захочет. Он может настраивать разные длительности и мелодии для каждого из них. Ему нужно посмотреть оставшееся время для каждого и уметь начинать, приостанавливать, продолжать и перезагружать всех, когда захочет. И он должен звонить с помощью кнопки «Стоп звонка», когда каждый таймер заканчивается, даже если экран выключен или еще одна активность находится сверху. – Dpedrinha

1

Вы должны заменить CountdownTimers с AlarmManager (как в ответ CommonsWare в), после установки его он будет инициировать функцию для выполнения на заданное время, вот официальное руководство:

http://developer.android.com/training/scheduling/alarms.html

Скоро вы будете убедитесь, что после перезагрузки устройства ваши сигналы тревоги потеряны, вам необходимо перезапустить их, перехватив android.intent.action.BOOT_COMPLETED.

Кроме того, вы не должны делать много работы в вашей тревоге OnReceive, вы должны передать информацию в какой-то другой компонент, как IntentService, чтобы сделать его безопасным в то время как устройство спит, вы должны использовать WakeLock (sample project).

[редактировать] ---- Вы должны также хранить ваши тревоги/рингтон данные, связанными с каким-то упорным хранением, вы можете использовать для этого общих предпочтений, или (более работы) базы данных SQLite.

+0

Как в справочнике Android: Примечание. Диспетчер аварийных сигналов предназначен для случаев, когда вы хотите, чтобы ваш код приложения запускался в определенное время, даже если ваше приложение в настоящее время не запущено. Для обычных операций синхронизации (тиков, тайм-аутов и т. Д.) Проще использовать Handler. Мой сценарий отличается. Это простые визуальные обратные часы, которые тикают и предупреждают пользователя, если он находится вне приложения. Кроме того, после kitkat, AlarmManager будет неточным. И в моем случае они заслуживают доверия. – Dpedrinha

+0

@Dpedrinha Просто ваш CountDownTimer будет уничтожен после того, как вы покинете свое приложение и начнете заниматься серфингом в Интернете. Это может не произойти немедленно. Что касается KitKat, я нашел следующую выдержку в документах AlarmManager: «Существуют новые API-интерфейсы для поддержки приложений, которым требуются строгие гарантии доставки, см. SetWindow (int, long, long, PendingIntent) и setExact (int, long, PendingIntent).» ' , – marcinj

Смежные вопросы