Урок 95. Service. Обратная связь с помощью PendingIntent

Обсуждение уроков
Feonik
Сообщения: 4
Зарегистрирован: 14 июл 2013, 00:33

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Feonik » 14 июл 2013, 00:59

Т.е. фишка PendingIntent здесь в том, что он содержит некую связь с Activity (в котором он был создан) и, когда вызывается метод send, он идет в это Activity и несет данные, если необходимо.
Благодарю за Ваши уроки, многое понял. Возник вопрос.

Создали активность, из него с PendingIntent запустили сервис. При каком-то условии из сервиса посылаем через PendingIntent сообщение в активность. Активность его принимает и обрабатывает. Все хорошо, пока в активности не нажмем кнопку "Назад". По ней активность будет уничтожена. Если мы вновь вызовем активность каким-либо способом, активность будет создана заново. А посылаемые сообщения из сервиса через PendingIntent этой вновь созданной активностью уже приниматься не будут, потому что "PendingIntent ... содержит некую связь с Activity (в котором он был создан)".

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

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение anber » 14 июл 2013, 11:01

Feonik писал(а):
Т.е. фишка PendingIntent здесь в том, что он содержит некую связь с Activity (в котором он был создан) и, когда вызывается метод send, он идет в это Activity и несет данные, если необходимо.
Благодарю за Ваши уроки, многое понял. Возник вопрос.

Создали активность, из него с PendingIntent запустили сервис. При каком-то условии из сервиса посылаем через PendingIntent сообщение в активность. Активность его принимает и обрабатывает. Все хорошо, пока в активности не нажмем кнопку "Назад". По ней активность будет уничтожена. Если мы вновь вызовем активность каким-либо способом, активность будет создана заново. А посылаемые сообщения из сервиса через PendingIntent этой вновь созданной активностью уже приниматься не будут, потому что "PendingIntent ... содержит некую связь с Activity (в котором он был создан)".

В общем, у меня проблема -- каким образом получить сообщение из сервиса, если запустившая его активность была уничтожена и потом создана заново? Если активность не была создана заново, то посылаемые сообщения можно игнорировать, они актуальны только для видимой активности.
97 и 98 уроки смотрел?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Feonik
Сообщения: 4
Зарегистрирован: 14 июл 2013, 00:33

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Feonik » 14 июл 2013, 18:19

anber писал(а):97 и 98 уроки смотрел?
Когда смотрел первый раз, понял, что мне это не подходит. Сейчас понял, что ошибся. Но всё еще не могу понять, каким образом можно в случае биндинга сообщить активности о том, что сервис сделал все, что нужно, и завершил работу?

То есть работает сервис. Создали новую активность и связались с сервисом. Сервис отработал и закрывается (stopSelf()). И теперь нужно активность проинформировать, что сервис завершился, чтобы соответственно отреагировать (что-то вывести на экран).

Feonik
Сообщения: 4
Зарегистрирован: 14 июл 2013, 00:33

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Feonik » 14 июл 2013, 19:03

Хотелось бы обойтись без BroadCast. Сервис в том же процессе, что и активность, не хотелось бы занимать лишние ресурсы.

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

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Mikhail_dev » 14 июл 2013, 19:12

Не экономьте на спичках. Я бы сделал так: Активности - один процесс, сервис - другой процесс. Связь через AIDL. Передача сложных объектов посредством Parcelable. Сервис стартует, после бросает бродкаст с информацией о том, что он закончил. Активность ловит его, и запрашивает у сервиса что ей надо, после чего останавливает сервис. В такой связке всё будет работать замечательно.

Feonik
Сообщения: 4
Зарегистрирован: 14 июл 2013, 00:33

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Feonik » 14 июл 2013, 19:25

no-- писал(а):Не экономьте на спичках. Я бы сделал так: Активности - один процесс, сервис - другой процесс. Связь через AIDL. Передача сложных объектов посредством Parcelable. Сервис стартует, после бросает бродкаст с информацией о том, что он закончил. Активность ловит его, и запрашивает у сервиса что ей надо, после чего останавливает сервис. В такой связке всё будет работать замечательно.
Благодарю, подчеркнутое оказалось для меня ключевым решением :) Кроме бродкаста, конечно.

lakomet
Сообщения: 3
Зарегистрирован: 22 окт 2013, 10:19

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение lakomet » 27 ноя 2013, 04:11

Доброго времени всем. У меня приложение падает с таким логом
11-27 10:03:36.187: W/dalvikvm(9438): threadid=1: thread exiting with uncaught exception (group=0x40de6908)
11-27 10:03:36.190: E/AndroidRuntime(9438): FATAL EXCEPTION: main
11-27 10:03:36.190: E/AndroidRuntime(9438): java.lang.IllegalStateException: Could not execute method of the activity
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.view.View$1.onClick(View.java:3598)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.view.View.performClick(View.java:4091)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.view.View$PerformClick.run(View.java:17072)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.os.Handler.handleCallback(Handler.java:615)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.os.Handler.dispatchMessage(Handler.java:92)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.os.Looper.loop(Looper.java:153)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.app.ActivityThread.main(ActivityThread.java:5198)
11-27 10:03:36.190: E/AndroidRuntime(9438): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 10:03:36.190: E/AndroidRuntime(9438): at java.lang.reflect.Method.invoke(Method.java:511)
11-27 10:03:36.190: E/AndroidRuntime(9438): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:826)
11-27 10:03:36.190: E/AndroidRuntime(9438): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
11-27 10:03:36.190: E/AndroidRuntime(9438): at dalvik.system.NativeStart.main(Native Method)
11-27 10:03:36.190: E/AndroidRuntime(9438): Caused by: java.lang.reflect.InvocationTargetException
11-27 10:03:36.190: E/AndroidRuntime(9438): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 10:03:36.190: E/AndroidRuntime(9438): at java.lang.reflect.Method.invoke(Method.java:511)
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.view.View$1.onClick(View.java:3593)
11-27 10:03:36.190: E/AndroidRuntime(9438): ... 11 more
11-27 10:03:36.190: E/AndroidRuntime(9438): Caused by: java.lang.NullPointerException
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.app.Activity.createPendingResult(Activity.java:4257)
11-27 10:03:36.190: E/AndroidRuntime(9438): at ru.example.p0951_servicebackpendingintent.MainActivity.onClickStart(MainActivity.java:48)
11-27 10:03:36.190: E/AndroidRuntime(9438): ... 14 more
11-27 10:03:37.886: I/Process(9438): Sending signal. PID: 9438 SIG: 9
Что я неправильно делаю?

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

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Defender77 » 13 дек 2013, 11:00

lakomet писал(а):Доброго времени всем. У меня приложение падает с таким логом
11-27 10:03:36.187: W/dalvikvm(9438): threadid=1: thread exiting with uncaught exception (group=0x40de6908)
...

11-27 10:03:36.190: E/AndroidRuntime(9438): Caused by: java.lang.NullPointerException
11-27 10:03:36.190: E/AndroidRuntime(9438): at android.app.Activity.createPendingResult(Activity.java:4257)
11-27 10:03:36.190: E/AndroidRuntime(9438): at ru.example.p0951_servicebackpendingintent.MainActivity.onClickStart(MainActivity.java:48)
Что я неправильно делаю?
В android 4 нужно вызывать так: pi = createPendingResult(TASK1_CODE, getIntent(), 0);
т.е. вместо null в параметрах нужно указать getIntent().

ftp27
Сообщения: 1
Зарегистрирован: 18 июн 2014, 21:04

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение ftp27 » 18 июн 2014, 21:11

screamer писал(а):Решил попробовать передачу в createPendingResult того же интента, которым я запускаю сервис (для андроида 4). Сработало.

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

        intent = new Intent(this, MyService.class);
        pi = createPendingResult(TASK1_CODE, intent, 0);
        intent.putExtra(PARAM_TIME, 7).putExtra(PARAM_PINTENT, pi);
        startService(intent);
Попробовал ваше решение. Получилось конечно, но судя по логам, то у меня постоянно отсылается intent с Pending-ом. Это вообще нормально?

edited> Заметил, что это происходит из за того, что функция на отправку лежала в onResume Activity. Печаль...

ibop
Сообщения: 3
Зарегистрирован: 18 фев 2013, 15:48

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение ibop » 17 авг 2014, 19:02

А вот у меня такой вопрос возник: я стартую сервис не из Активити, а из фрагмента. И собственно жду onActivityResult во фрагменте. Но он, логично, срабатывает только в активити, которая этот фрагмент и содержит, а фрагмент игнорит. Что подскажут местные гуру?

Nikolay
Сообщения: 6
Зарегистрирован: 30 мар 2015, 17:04

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Nikolay » 30 мар 2015, 17:12

Добрый день, у меня не идет урок 95 (все остальные до 95 идут)
эмулятор при нажатии кнопки "Start" выдает ошибку "В приложении p0951_servicebackpendingintent произошла ошибка".

В манифесте сервис прописан одной ниже приведенной строчкой
<service android:name=".MyService"/>

Среда разработки Android Studio

Помогите решить описанную проблему.

Nikolay
Сообщения: 6
Зарегистрирован: 30 мар 2015, 17:04

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение Nikolay » 30 мар 2015, 19:32

По предыдущему посту, уже нашел вопрос снят

Трассировка показала ошибка в строчке
pi = createPendingResult(TASK2_CODE, null, 0);

Android developer приводит пример с таким написанием
createPendingResult(TASK2_CODE, new Intent(), 0);

После исправления трех строчек у меня все заработало как описывает пример.

MOZGUN
Сообщения: 1
Зарегистрирован: 24 авг 2018, 12:02

Re: Урок 95. Service. Обратная связь с помощью PendingIntent

Сообщение MOZGUN » 24 авг 2018, 12:06

Большое спасибо за уроки!
Вот появился вопрос.
В методе run
есть строка
70 pi.send(MyService.this, MainActivity.STATUS_FINISH, intent);

Если заменить
pi.send(this, MainActivity.STATUS_FINISH, intent); вылезает ошибка.
В чем разница между MyService.this и просто this?

Ответить