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

Обсуждение уроков
Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

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

Сообщение Kirill » 25 сен 2015, 15:22

neoksi писал(а):
etlt писал(а):Подскажите: как при клике на уведомление вызвать тот же самый экземпляр Activity?

Опишу проблему: Из активити запускается сервис который вызывает уведомление, однако при клике на уведомление открывается тоже самое Активити, НО новое т.е. в итоге имеем 2 одинаковые запущенные активи, а нужно чтобы из уведомление вызывалось только 1 активити
Вот сам сегодня с этим же столкнулся, решение тут: viewtopic.php?f=35&t=1159
А на самом деле не так все просто.

Если в манифесте для активити прописать android:launchMode="singleTop" или "singleInstance"
и вызывать активити из нотификейшена происходит следующее:

1. Если активити закрыли (нажали кнопку "назад" и вызвался onDestroy()) то когда кликнуть по нотификейшену - мы откроем активити и текстовое поле покажет имя файла. Потому что в MainActivity сработает getIntent() мы получим интент который содержит Extra с названием файла. Тут вопросов нет. Но...
2. Если активити скрыли (нажали Хоум и onDestroy() не вызвался) то когда в таком случае мы кликнем по нотификейшену - тоже откроется Активити но текстовое поле не обновится. Потому что если подебажить можно увидеть что getIntent дает нам интент без Extra. Все из-за того что getIntent() дает нам "старый" интент, который испольовался когда впервые открылии Активити. А в нем никаких экстра нет.


Для того чтобы каждый раз одно и то же Актвити при открытии показывало обновленное поле (а значит получало новый иинтент) надо сделать следующее:

1. код обновления textview вынести в отдельный метод и вызывать его и в onCreate() и в onResume()
[syntax=java5] private void updateTv(){
receivedIntent = getIntent();
String file = receivedIntent.getStringExtra(PARAM_FILENAME);
tvInfo.setText(file);
}[/syntax]

2. переопределить метод onNewIntent() - это метод, который вызывается как раз в наших случаях: когда интентом вызывается существующий актвити , вместо того чтобы создавать новый.

[syntax=java5] @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}[/syntax]
на вход аргументом приходит новый интент и мы его устанавливаем для текущего актвити (по сути обновляем) методом setIntent(). Теперь когда мы вызовем gеtIntent() мы получим уже новый интент. С нашими экстра.

Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

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

Сообщение Kirill » 25 сен 2015, 15:54

для тех, кто запускает на последних версиях:
сейчас нотификейшен создается через билдер
картинки добавляются немного странно: маленькая, которая будет в статус баре висеть, - добавляетсяя просто как код ресурса,
а большая только как Bitmap или Icon поэтому надо обернуть это все в битмап фактори, зачем такой изврат - хз. Возможно станет сно в следующих уроках про Bitmap
(Картинки предварительно залить в папку drawable)

[syntax=java5]
private void sendNotif() {

Notification.Builder nBuilder = new Notification.Builder(this)
.setContentTitle("Title of notification")
.setContentText("Some context text here")
.setSmallIcon(R.drawable.ic_sms_failed_black_18dp)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_sms_failed_black_48dp));


// 3-я часть Click on notification
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.PARAM_FILENAME, "somefile.txt");
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

nBuilder.setContentIntent(pIntent);


Notification notif = nBuilder.build();
// ставим флаг, чтобы уведомление пропало после нажатия
notif.flags |= Notification.FLAG_AUTO_CANCEL;
notif.defaults = Notification.DEFAULT_ALL;
notif.number = 5;


// отправляем
notificationManager.notify(1, notif);
}
[/syntax]

CAIIKA
Сообщения: 17
Зарегистрирован: 13 май 2013, 15:47

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

Сообщение CAIIKA » 27 сен 2015, 12:35

Всем привет)) кто знает почему перестает работать нотификация как только выбираешь приложение, приложением по умолчанию для приема сообщений. т.е. иконка нотификации приходит но по клику ничего не происходит до версии 4.4 выбора не предлагается и все работает ок,
на версии 4.4 если при выборе отказаться от установки по умолчанию то тож все нормально работает

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

void sendNotification(String number, String message, Context context, String from) {

        Log.d("Log", "number: " + number);

        NotificationManager manager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        long when = System.currentTimeMillis();

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_launcher_).setTicker(message).setWhen(when)
                .setAutoCancel(true).setContentTitle(from)
                .setContentText(message)
                .setDefaults(Notification.DEFAULT_ALL);
        
        Intent intent = new Intent(context, ConversationsActivity.class);
        intent.putExtra("number", number);
        intent.putExtra("newsms",true);
//        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
//        stackBuilder.addParentStack(ConversationsActivity.class);
//        stackBuilder.addNextIntent(intent);
//        PendingIntent resultPendingIntent =
//                stackBuilder.getPendingIntent(
//                        0,
//                        PendingIntent.FLAG_UPDATE_CURRENT
//                );
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent resultPendingIntent =PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        manager.notify((int) System.currentTimeMillis(), mBuilder.build());

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

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

Сообщение danek130995 » 28 сен 2015, 13:50

Kirill, спасибо, помогли!

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

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

Сообщение GRAF_COLLIOSTRO » 07 окт 2015, 08:44

Kirill, спасибо! оно так быстро всё обновляется, что уследить за всем просто не успеваю(

после обновления платформы до пятёрки урок накрылся( ваш примерчик помог.

правда теперь зарылся в инфу про прозрачность( там в пятёрке можно выводить нотификаторы на экран блокировки и рядом с часами. только требования к картинке - белая и прозрачная. короче не всё так просто как было, сижу вот разбираюсь

vadym
Сообщения: 2
Зарегистрирован: 29 окт 2015, 17:51

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

Сообщение vadym » 29 окт 2015, 17:55

Здравствуйте, подскажите пожалуйста, как создать уведомление, которое будет отправляться, если в приложение не заходили сутки(24 часа), на примере кода из данного урока?

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

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

Сообщение GRAF_COLLIOSTRO » 10 дек 2015, 07:16

как создать уведомление, которое будет отправляться, если в приложение не заходили сутки(24 часа), на примере кода из данного урока?
могу предположить, что сие поведение можно описать ручками: внутри приложения периодически ставить будильник на 24 часа. в случае если 24 часа не прошло, то он обновится. если прошло то в ресивере выкинуть соответствующую нотификацию.

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

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

Сообщение GRAF_COLLIOSTRO » 10 дек 2015, 07:25

ребят, подскажите как отследить, что юзверь сейчас находится в приложении??? мне не нужно его уведомлять, когда он активно юзает прогу.

у меня висит будильник alarmmanager. broadcast ресивер получает интент и вывешивает нотификацию. но она не нужна, если на этот момент юзверь находится в приложении.

на просторах интернета предлагают в активити на onСreate вешать флаг-булку true, ну и соответсвенно false на выходе, но у меня в проге несколько десятков активностей. я устану вывешивать флаг, где сейчас находится юзверь. может есть варианты попроще?

WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

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

Сообщение WKBAPKA » 14 фев 2016, 16:48

Если использовать notification.setLatestEventInfo(), то при открытии нового Активити метод intent.getStringExtra
возвращает null. А если использовать уже новый код, тогда возвращает то что поместил через putExtra.

по логике, как я понимаю, когда мы вызываем метод getActivity() класса PendingIntent, мы в него помещаем объект Intent, в который можно упаковать доп. данные через putExtra. И когда нажимаем на уведомление, андроид открывает Activity используя объект Intent в котором уже упакованы данные. Почему возвращается null?

P.S. Помучал, заработало. Что это было хз.

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

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

Сообщение GRAF_COLLIOSTRO » 26 фев 2016, 22:40

ребят, повторю вопрос, ибо очень актуально!

как будет выглядеть такая логика:

если пользователь в приложении, то не посылать уведомления. он итак всё видит. А если вышел (свернул) то делать нотификацию.

за что зацепиться? чот не соображу(

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

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

Сообщение Mikhail_dev » 27 фев 2016, 16:56

Если текущая открытая Activity имеет ту же информацию, что и уведомление, то можно не показывать. Если уведомление не имеет отношения к показываемой Activity, то можно и показать. Я лично не показываю только в случае, если открыта активити уведомлений

ipinguin-linuxoid
Сообщения: 1
Зарегистрирован: 08 апр 2016, 15:00

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

Сообщение ipinguin-linuxoid » 08 апр 2016, 15:14

Привет всем! Заранее извиняюсь если пишу не в ту ветку или не туда - на этом форуме я недавно. Я заметил одну интересную особенность контекста и в связи с этим у меня возник вопрос. И так - я использую broadcast reciever из него запускаю сервис который генерироует уведомлени .
уведомлений несколько - и все они имеют внутри интент ссылающийся на определенную активность. Когда я нажимаю на первое уведомление -
все работает хорошо - я перехожу в нужную активность. Но при клике на второе и дальше уведомление - не происходит ничего - создалось впечатление что в них пустые интенты внутри. Что характерно - если запускать этот же сервис с активити - то проблемы нет - каждое уведомление ведет на нужную активность.

схема следующая
mainActivity -> startService(new Intent(this, SomeService.class)); работает отлично
myreciever - > startService(new Intent(context, SomeService.class); - возникает выше обозначеный баг. Как я понял проблема в контексте.

Внимание вопрос - как использовать контекст активити в broadcast reciever? и почему так происходит?

lexmulya
Сообщения: 1
Зарегистрирован: 01 ноя 2016, 11:37

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

Сообщение lexmulya » 01 ноя 2016, 11:50

Здравствуйте.
Сделал все как в уроке, все работает. Сервер через curl успешно шлет сообщения. Но появилась задача кроме добавления уведомления еще показывать информацию в окне, даже на выключенном дисплее(аля viber) подскажите куда копать?
P.S. пишу под андроид 4.0 и выше.

itdevelopers133
Сообщения: 1
Зарегистрирован: 24 июн 2019, 19:14

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

Сообщение itdevelopers133 » 24 июн 2019, 19:18

damager82 писал(а):
or8it писал(а):Подскажите пожалуйста, можно ли по клику на уведомлении вызвать любое другое активити. Если да, то как?
Когда создаете Intent (третья часть), указываете там данные для вызова нужного вам Activity. Оно в итоге и вызовется...
Подскажите пожалуйста я вызываю нужный мне активити
Intent intent = new Intent(this, MainActivity.class);
но при клике на уведомление у меня убиваеться приложение с ошибкой
java.lang.RuntimeException: Unable to start service pro.simple.simple_v001.MyService@483a5ca with Intent { cmp=pro.simple.simple_v001/.MyService }
что делать ?

Ответить