2012-03-29 2 views
1

У меня есть виджет, который при нажатии посылает широковещательную рассылку, которая запускает CountDownTimer, который обновляет мой виджет, а в конце воспроизводит сигнал тревоги. Это прекрасно работает в эмуляторе.Как я могу убедиться, что CountDownTimer тикает и завершает?

На моем телефоне, однако, это совсем другая история. Мой телефон настолько ограничен ресурсами, что мой процесс регулярно убивается, что, конечно же, означает, что CountDownTimer больше не обновляет мой виджет.

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

Мой вопрос: есть ли способ удостовериться, что CountDownTimer продолжает тикать и, наконец, вызывает onFinish(), или мне нужно просто отказаться от него и переключиться на AlarmManager и «неправильно использовать» его? Также приветствуются любые другие варианты гарантии того, что вещь тикает и заканчивается.

Я должен добавить, что я не могу полагаться на ОС, вызывающий onUpdate(), потому что он будет делать это не быстрее, чем каждые 30 минут, а также потому, что большую часть времени виджет просто ничего не делает. Только когда его щелкают, он гаснет каждую секунду в течение нескольких минут.

ответ

0

Что я в итоге сделал, это переход от BroadcastReceiver к сервису. Не только использование фиктивного сервиса, но и реальное обслуживание воплощают то, что ранее делало BroadcastReceiver.

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

0

Я думаю, что это решение .. Создать фиктивный сервис ..

public class DummyService extends Service{ 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
    public void onCreate() { 
     super.onCreate(); 

    } 
    @Override 
    public void onDestroy() { 

     super.onDestroy(); 

    } 
} 

и запустить его из вашей деятельности, используя countdowntimer как это .. в OnCreate деятельности

Intent intent = new Intent(this, DummyService.class); 
startService(intent); 

и также не забывайте объявить эту услугу в своем манифесте следующим образом.

<service android:name=".DummyService" > 
</service> 

надеюсь, что это поможет ..

+0

Что это будет сделано? –

+0

Службы все еще могут быть убиты. Кроме того, вещь, которая имеет CountDownTimer, не является активностью, это BroadcastReceiver, но, возможно, это не имеет значения. В основном мы будем использовать эту услугу в качестве якоря. Я знаю, что произойдет. Клиенты все равно будут жаловаться, что иногда обратный отсчет не будет работать ... –

+0

На самом деле услуга в сочетании с этим может быть билетом: http://stackoverflow.com/questions/3856767/android-keeping-a-background-service-alive-preventing-process-death –

0

Чтобы добавить к the accepted answer: из того, что я помню, BroadcastReceiver живет только до тех пор, пока требуется обработка трансляции.

Так что запуск таймера или что-то в пределах BroadcastReceiver не будет работать (как указано).

Именно поэтому рекомендуется использовать BroadcastReceiver для запуска Service, который будет выполнять синхронизацию. Конечно, услугу можно убить, но не раньше, чем BroadcastReceiver.