Страница 2 из 2

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 14 июл 2013, 19:03
Feonik
Хотелось бы обойтись без BroadCast. Сервис в том же процессе, что и активность, не хотелось бы занимать лишние ресурсы.

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

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

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

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

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

Добавлено: 27 ноя 2013, 04:11
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): 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
Что я неправильно делаю?

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

Добавлено: 13 дек 2013, 11:00
Defender77
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().

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

Добавлено: 18 июн 2014, 21:11
ftp27
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. Печаль...

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

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

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

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

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

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

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

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

Добавлено: 30 мар 2015, 19:32
Nikolay
По предыдущему посту, уже нашел вопрос снят

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

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

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

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

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

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

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

Добавлено: 12 дек 2020, 12:30
Kij
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.

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

Добавлено: 10 мар 2021, 19:49
ostropik

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

        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);

    }