Урок 99. Service. Уведомления - notifications

Обсуждение уроков
Romillionaire
Сообщения: 7
Зарегистрирован: 28 июн 2013, 11:26

Re: Урок 99. Service. Уведомления - notifications

Сообщение Romillionaire » 31 авг 2013, 01:31

У меня есть DatePickerDialog. Пользователь выбирает дату и по этой дате мне нужно установить notification. Как сделать так чтобы notification сработал допустим через два дня если пользователь на DatePickerDialog установил дату на два дня вперед. Куда в вашем примере устанавливается дата и в каком формате ?

tytryn
Сообщения: 7
Зарегистрирован: 23 мар 2013, 15:01

Re: Урок 99. Service. Уведомления - notifications

Сообщение tytryn » 31 авг 2013, 19:10

Не знаю на сколько валидно так делать, но я подобную фишку делал так

[syntax=java]
public void AsynchronousPing() {
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousPing = new TimerTask() {
@Override
public void run() {

handler.post(new Runnable() {
@Override
public void run() {
try {
//Тут пишешь код который нужно, у меня тут запускается поток AsyncTask
} catch (Exception e) {
e.printStackTrace();
Log.w(LogTag, "AsynchronousPing: " + e.getMessage());
}
}
});
}
};
timer.schedule(doAsynchronousPing, 0, 120000); //интервал 2 минуты
}
[/syntax]
Спасибо вроде работает.

Snik
Сообщения: 22
Зарегистрирован: 11 сен 2013, 16:42

Re: Урок 99. Service. Уведомления - notifications

Сообщение Snik » 11 сен 2013, 17:48

Столкнулся с проблемой - не могу передать больше одного раза новое значение вот тут:

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

intent.putExtra(MainActivity.FILE_NAME, "somefile");
Попытка изменить текст (скажем, послать somefile2 при следующем запуске) не удается - все равно в MainActivity приходит старый текст, от первого запуска:

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

String fileName = intent.getStringExtra(FILE_NAME); //тут всегда одно и то же

Правда, иногда получается с какой-то попытки получить новый текст на эмуляторе 2.3.3, но совершенно стабильно не проходит на реальном устройстве с 4.3 - убиение процессов не помогает, только после перезагрузки опять-таки 1 раз можно послать значение, и все. Похоже, где-то это дело кэшируется. Как можно решить эту проблему? Ну кроме как записывая данные из сервиса в БД или в файл и считывая его при запуске активити?

nazi
Сообщения: 3
Зарегистрирован: 06 сен 2013, 06:29

Re: Урок 99. Service. Уведомления - notifications

Сообщение nazi » 12 сен 2013, 11:24

привет всем форумчанам!
есть приложение-server, которое все время должен слушать сообщения клиента. процесс я поместила пока в сервис по примеру урока 98. ошибок не выдает, но я не уверена, что все работает корректно, так как не вижу полученных сообщений. хочу добавить уведомления при получении сообщения, как в этом уроке и передать это сообщение в активити, но не знаю как правильно запустить сервис.
в 98 уроке сервис с активити запускается так:

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

 в onCreate:
    intent = new Intent(this, MyService.class);
    sConn = new ServiceConnection() {

      public void onServiceConnected(ComponentName name, IBinder binder) {
        Log.d(LOG_TAG, "MainActivity onServiceConnected");
        myService = ((MyService.MyBinder) binder).getService(); 
        bound = true;
      }

      public void onServiceDisconnected(ComponentName name) {
        Log.d(LOG_TAG, "MainActivity onServiceDisconnected");
        bound = false;
      }
    }; 
 
в onClickStart:
    startService(intent);
а в 99 уроке сервис запускается так:

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

 в onCreate:
    Intent intent = getIntent();

    String fileName = intent.getStringExtra(FILE_NAME);
    if (!TextUtils.isEmpty(fileName))
      tv.setText(fileName);

в onClickStart
    startService(new Intent(this, MyService.class));
как запустить сервис так, чтобы были и локальный биндинг, и уведомления?

Snik
Сообщения: 22
Зарегистрирован: 11 сен 2013, 16:42

Re: Урок 99. Service. Уведомления - notifications

Сообщение Snik » 12 сен 2013, 11:43

Нашел решение своей проблемы тут: https://groups.google.com/forum/#!topic ... gYLJ8iTSSE
Надо выставлять флаги, например так:
[syntax=java]PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);[/syntax]
- теперь, если этот интент уже сидит где-то в кэше, то его extras обновятся.
Кстати, хорошо бы это в уроке отметить - что не просто есть флаги, а какие и как они влияют на поведение.
Последний раз редактировалось Snik 12 сен 2013, 11:48, всего редактировалось 1 раз.

Snik
Сообщения: 22
Зарегистрирован: 11 сен 2013, 16:42

Re: Урок 99. Service. Уведомления - notifications

Сообщение Snik » 12 сен 2013, 11:48

nazi писал(а): как запустить сервис так, чтобы были и локальный биндинг, и уведомления?
Есть мнение, что в данном случае никак - насколько я понял, локальный биндинг работает тогда, когда и сервис, и активити в 1 процессе. А в уроке с уведомлениями сервис запускается в отдельном процессе. Значит, локальный биндинг не подходит. Можно попробовать слать броадкасты.
Поправьте меня кто-нибудь, если я неправ.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 99. Service. Уведомления - notifications

Сообщение Isaev » 05 ноя 2013, 15:05

А приложение имеет доступ только в "своим" уведомнениям?
т.е. id по умолчанию уникальны? или есть вероятность своим затереть чужое при совпадении id?

kimreik
Сообщения: 5
Зарегистрирован: 12 янв 2013, 02:37

Re: Урок 99. Service. Уведомления - notifications

Сообщение kimreik » 23 ноя 2013, 13:46

Не уверен, описывался ли этот процесс ранее по урокам. Но стоило бы указать в уроке, что DEFAULT флаги устанавливаются через notif.defaults а не notif.flags.

srg_
Сообщения: 5
Зарегистрирован: 19 дек 2013, 10:13

Re: Урок 99. Service. Уведомления - notifications

Сообщение srg_ » 19 дек 2013, 10:29

Пример сделал. Все отработало отлично. Благодарю за науку. :)

Пытаюсь пример усложнить.
Передаю массив строк формата "ЧЧ:ММ Текст".
И пытаюсь сделать постоянно работающий сервис. Циклю раз в минуту.

Ну и как бы работает, но как-то нестабильно.
Параллельно пишу лог в текстовый файл. И видно, что бывает несколько раз в минуту срабатывает,
а иногда пропускает часами - и снова пишет...
Паузу делал и так и так:
TimeUnit.MINUTES.sleep(1);
Thread.sleep(60*1000);
Разницы нет. Работает нестабильно.

Заметил так же непонятную работу stopService.
Пример.
stopService
Убеждаюсь в запущенных приложениях что сервис отсутствует.
Меняю свой массив.
startService
И вижу в логе опрос двух массивов, каждый отдельно в свое время.
Пробовал возвращать START_NOT_STICKY в onStartCommand - ничего толком не получилось.

Подскажите плз куда копать?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 99. Service. Уведомления - notifications

Сообщение Mikhail_dev » 19 дек 2013, 10:36

И пытаюсь сделать постоянно работающий сервис. Циклю раз в минуту.
Что значит пытаетесь сделать постоянно работающий сервис? И что Вы циклите?
Сервис раз запустил и он работает.
Кстяти, если сервис не в отдельном процессе, то он находится в процессе главного UI, а это значит что при выходе из приложения, в скором времени умрет и сервис.

srg_
Сообщения: 5
Зарегистрирован: 19 дек 2013, 10:13

Re: Урок 99. Service. Уведомления - notifications

Сообщение srg_ » 19 дек 2013, 11:34

Сори. Неправильно выразился.
Действительно. Сервис запущен 1 раз.
onStartCommand вызывает процедуру, которая запускает новый поток.
В нем - цикл while ()
Ну и раз в минуту должны бы выводиться уведомления.
Сервис может перезапускаться:
stopService
startService
И происходят странные, выше описанные вещи...

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 99. Service. Уведомления - notifications

Сообщение Mikhail_dev » 19 дек 2013, 11:51

Давайте так. Что Вы хотите в итоге получить =)

srg_
Сообщения: 5
Зарегистрирован: 19 дек 2013, 10:13

Re: Урок 99. Service. Уведомления - notifications

Сообщение srg_ » 19 дек 2013, 12:37

Ок.
Есть активити с листвью.
В него вбивается время и текст уведомления.
И есть кнопка Старт сервиса.
Хочу получить:
1. Передаю список событий.
Начало цикла.
2. Мониторю время, или событие не наступило.
3. Если наступило - вывожу уведомление.
4. Мониторю дальше до наступления след. события.
КонецЦикла.

В активити добавил новое событие.
Перезапустил сервис.
И пошла работа с п1 по п4...

И в принципе я это получаю. Но как-то через раз и со странностями в логах.

СПС за внимание и отзывчивость. :)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 99. Service. Уведомления - notifications

Сообщение Mikhail_dev » 19 дек 2013, 16:10

Я так понимаю сервис должен работать отдельно от графической части приложения? Или он должен работать ТОЛЬКО ТОГДА, когда мы лицезреем нашу программу?

srg_
Сообщения: 5
Зарегистрирован: 19 дек 2013, 10:13

Re: Урок 99. Service. Уведомления - notifications

Сообщение srg_ » 19 дек 2013, 16:11

Хотелось бы чтобы и отдельно мог. :)
Своего рода будильник, можно сказать...

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 99. Service. Уведомления - notifications

Сообщение Mikhail_dev » 19 дек 2013, 16:54

Тогда делайте отдельным ПРОЦЕССОМ (не потоком, процессом. В манифест надо добавить к сервису :remote) сервис, увеличивайте его до foreground (материал по теме http://developer.android.com/guide/comp ... Foreground), после чего общайтесь между процессами через AIDL интерфейс.
Проблема в том, что сервис у Вас находится в UI процессе. Вот захочется андроиду выгрузить ваше приложение, потому как оно свёрнуто и вы им не пользуетесь, он грохнет весь процесс, вместе с сервисом. Так что сервис отдельно, программу для работы с сервисом отдельно. Точнее это будет одно приложение, но в два процесса. Это мой видение проблемы.

srg_
Сообщения: 5
Зарегистрирован: 19 дек 2013, 10:13

Re: Урок 99. Service. Уведомления - notifications

Сообщение srg_ » 19 дек 2013, 17:06

СПС большое. Ушел разбираться. :)

Wp8Lover
Сообщения: 5
Зарегистрирован: 27 окт 2013, 13:05

Re: Урок 99. Service. Уведомления - notifications

Сообщение Wp8Lover » 22 дек 2013, 22:21

Далее мы оборачиваем этот Intent в PendingIntent, с помощью метода getActivity. На вход ему передаем контекст и Intent. Второй параметр не используется (так написано в хелпе).
Если Ваше приложение добавляет больше одного уведомления, то второй параметр должен отличаться для каждого уведомления, допустим, на него надо ставить итератор. Иначе будет отрабатываться нажатие только для самого последнего (верхнего) уведомления.

sh_rv
Сообщения: 18
Зарегистрирован: 11 сен 2013, 18:15

Re: Урок 99. Service. Уведомления - notifications

Сообщение sh_rv » 15 янв 2014, 23:32

А у меня вообще не получается передать данные из Activity в сервис( Подскажите, как это делается

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 99. Service. Уведомления - notifications

Сообщение Mikhail_dev » 15 янв 2014, 23:44

Если обычный сервис и не в отдельном процессе, то можно так
http://stackoverflow.com/a/15899750/2337544
или тоже самое, но другой пример
http://www.coderanch.com/t/603994/Andro ... ng-Service

Ответить