Урок 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?

Kij
Сообщения: 1
Зарегистрирован: 12 дек 2020, 12:27

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

Сообщение Kij » 12 дек 2020, 12:30

Great lesson but a bit deprecated.

Please update one critical point in the lesson. "createPendingResult" input parameter "data" can't be null in the android sdk versions. Now you have to pass at least "new Intent()" in this case.

ostropik
Сообщения: 3
Зарегистрирован: 07 мар 2021, 12:54

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

Сообщение ostropik » 10 мар 2021, 19:49

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

        public void onClickStart(View v) {
        PendingIntent pi;
        Intent intent;

        // Создаем PendingIntent для Task1
        pi = createPendingResult(TASK1_CODE, new Intent(), 0);
        // Создаем Intent для вызова сервиса, кладем туда параметр времени
        // и созданный PendingIntent
        intent = new Intent(this, MyService.class).putExtra(PARAM_TIME, 7)
                .putExtra(PARAM_PINTENT, pi);
        // стартуем сервис
        startService(intent);

        pi = createPendingResult(TASK2_CODE, new Intent(), 0);
        intent = new Intent(this, MyService.class).putExtra(PARAM_TIME, 4)
                .putExtra(PARAM_PINTENT, pi);
        startService(intent);

        pi = createPendingResult(TASK3_CODE, new Intent(), 0);
        intent = new Intent(this, MyService.class).putExtra(PARAM_TIME, 6)
                .putExtra(PARAM_PINTENT, pi);
        startService(intent);

    }

Ответить