Service, BroadcastReceiver и их SharedPreferences

Ответить
MAGISTR-Shuba
Сообщения: 15
Зарегистрирован: 04 июн 2013, 18:39

Service, BroadcastReceiver и их SharedPreferences

Сообщение MAGISTR-Shuba » 30 сен 2013, 11:45

Всем доброго времени суток =) Постарался изложить как можно яснее свою проблему )
Описание:
Пользователь заходит в приложение, указывает какое-то время. Ему через это время выкидывается какое-либо сообщение (не суть).

Задача:
Сделать так, чтобы сообщение вывелось именно через время, указанное пользователем. Вдобавок, если пользователь выключает устройство и включает его - ПРОДОЛЖАЕТСЯ отсчет времени или же высвечивается сообщение о финише таймера. Более того, сделать процесс неубиваемым (кроме удаления самого приложения, конечно) =)

Как пытаюсь делать я:
Почитав о таймерах, алармах и прочих инструментах, я решил использовать следующую схему:
Когда пользователь настроил нужное кол-во времени - в SharedPreferences (sPref) записывается текущее время и время, когда нужно "появиться" сообщению. Этот sPref я передаю фоновому сервису (запускающемуся по аларму каждые n миллисекунд, дабы презреть свое состояние убиваемости) и бродкасту (тому, что срабатывает после ребута). После ребута бродкаст снова запускает сервис с временем, которое у него отложилось.

Проблема:
В бродкасте интент от SharedPreferences - null, и я не знаю что с этим поделать..К тому же хочу избежать записи времени на карту памяти или как-то вне рамках приложения..
Народ, помогите кто в теме - уже кучу времени убил на такую "простенькую" задачу

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение adarash » 30 сен 2013, 11:58

покажи, пожалуйста, код когда ты записываешь в него и когда берешь из него.

MAGISTR-Shuba
Сообщения: 15
Зарегистрирован: 04 июн 2013, 18:39

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение MAGISTR-Shuba » 30 сен 2013, 12:25

adarash писал(а):покажи, пожалуйста, код когда ты записываешь в него и когда берешь из него.
Вытащил основной код из бродкаста:

Код: Выделить всё

public void onReceive(Context context, Intent intent) {
		this.context=context;
		sPref = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
		ed = sPref.edit();


                 if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()) 
		{
                     timeBefore=sPref.getLong("timeBefore", 0);
                }
записываю:

Код: Выделить всё

ed.putLong("timeBefore", timeBefore);
P.S. В других классах с интентами проблем нет, только с ресивером.. Мне все-таки кажется что тут проблема в том, что ресивер не записывает значение сразу как только его получает (так как он стартует только при перезагрузке). Можно ли как-то принудительно это делать? Иначе данные, как я понял, просто до него не доходят и "теряются"..

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение adarash » 30 сен 2013, 12:33

ed.comit(); при записи выполнял?
типа

Код: Выделить всё

ed.putLong("timeBefore", timeBefore); 
ed.comit();

MAGISTR-Shuba
Сообщения: 15
Зарегистрирован: 04 июн 2013, 18:39

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение MAGISTR-Shuba » 30 сен 2013, 12:40

adarash писал(а):ed.comit(); при записи выполнял?
типа

Код: Выделить всё

ed.putLong("timeBefore", timeBefore); 
ed.comit();
Ну да) я говорю - с этим во всех остальных классах проблем не возникло, только с ребут-ресивером

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение adarash » 30 сен 2013, 12:49

Причины может быть 3: Первая - переменная не записывается.Также если SharedPreferences - null, то это может означать, что ты не тот SharedPreferences запрашиваешь, либо у тебя к нему доступа нет. Проект на Github-e у тебя?

MAGISTR-Shuba
Сообщения: 15
Зарегистрирован: 04 июн 2013, 18:39

Re: Service, BroadcastReceiver и их SharedPreferences

Сообщение MAGISTR-Shuba » 30 сен 2013, 13:26

adarash писал(а):Причины может быть 3: Первая - переменная не записывается.Также если SharedPreferences - null, то это может означать, что ты не тот SharedPreferences запрашиваешь, либо у тебя к нему доступа нет. Проект на Github-e у тебя?
Нет, на гите нет..

Код: Выделить всё

private void save()
	{
		ed.putLong("timeBefore", timeBefore);
                ed.commit();
		
		Intent intent = new Intent(Service.this, BroadCastReboot.class);
		intent.putExtra("timeBefore", timeBefore);
                sendBroadcast(intent);
	}
Т.е. у меня каждый раз когда происходит проверка времени - она автоматически сохраняет текущее время и передает его бродкасту (основной поток происходит в onStartComand() в сервисе, из которого вызывается save(), если это важно...)
Кстати, при регистрации - бродкаст нормально вытаскивает данные, , а вот при перезагрузке устройства, когда он должен запускаться и снова вытаскивать из интента sPref- выкидывает null..
Не приведете простенький пример как передавать SharedPreferences загрузочному бродкасту, чтобы он его мог отобразить хотя бы в тосте? %)

Ответить