Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 23 июл 2019, 16:22

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 154 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8
Автор Сообщение
СообщениеДобавлено: 25 сен 2015, 15:22 
Аватар пользователя

Зарегистрирован: 09 сен 2015, 13:53
Сообщений: 19
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
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()
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     private void updateTv(){
  2.         receivedIntent = getIntent();
  3.         String file = receivedIntent.getStringExtra(PARAM_FILENAME);
  4.         tvInfo.setText(file);
  5.     }


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

Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     @Override
  2.     protected void onNewIntent(Intent intent) {
  3.         super.onNewIntent(intent);
  4.         setIntent(intent);
  5.     }

на вход аргументом приходит новый интент и мы его устанавливаем для текущего актвити (по сути обновляем) методом setIntent(). Теперь когда мы вызовем gеtIntent() мы получим уже новый интент. С нашими экстра.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 сен 2015, 15:54 
Аватар пользователя

Зарегистрирован: 09 сен 2015, 13:53
Сообщений: 19
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
для тех, кто запускает на последних версиях:
сейчас нотификейшен создается через билдер
картинки добавляются немного странно: маленькая, которая будет в статус баре висеть, - добавляетсяя просто как код ресурса,
а большая только как Bitmap или Icon поэтому надо обернуть это все в битмап фактори, зачем такой изврат - хз. Возможно станет сно в следующих уроках про Bitmap
(Картинки предварительно залить в папку drawable)

Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.  private void sendNotif() {
  2.  
  3.         Notification.Builder nBuilder = new Notification.Builder(this)
  4.                 .setContentTitle("Title of notification")
  5.                 .setContentText("Some context text here")
  6.                 .setSmallIcon(R.drawable.ic_sms_failed_black_18dp)
  7.                 .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_sms_failed_black_48dp));
  8.  
  9.  
  10.         // 3-я часть  Click on notification
  11.         Intent intent = new Intent(this, MainActivity.class);
  12.         intent.putExtra(MainActivity.PARAM_FILENAME, "somefile.txt");
  13.         PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  14.  
  15.         nBuilder.setContentIntent(pIntent);
  16.  
  17.  
  18.         Notification notif = nBuilder.build();
  19.         // ставим флаг, чтобы уведомление пропало после нажатия
  20.         notif.flags |= Notification.FLAG_AUTO_CANCEL;
  21.         notif.defaults = Notification.DEFAULT_ALL;
  22.         notif.number = 5;
  23.  
  24.  
  25.         // отправляем
  26.         notificationManager.notify(1, notif);
  27.     }
  28.  


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 сен 2015, 12:35 

Зарегистрирован: 13 май 2013, 15:47
Сообщений: 17
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Всем привет)) кто знает почему перестает работать нотификация как только выбираешь приложение, приложением по умолчанию для приема сообщений. т.е. иконка нотификации приходит но по клику ничего не происходит до версии 4.4 выбора не предлагается и все работает ок,
на версии 4.4 если при выборе отказаться от установки по умолчанию то тож все нормально работает

Код: [ Загрузить ] [ Скрыть ]
  1. void sendNotification(String number, String message, Context context, String from) { 
  2.  
  3.         Log.d("Log", "number: " + number); 
  4.  
  5.         NotificationManager manager = (NotificationManager) context 
  6.                 .getSystemService(Context.NOTIFICATION_SERVICE); 
  7.  
  8.         long when = System.currentTimeMillis(); 
  9.  
  10.         NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
  11.                 .setSmallIcon(R.drawable.ic_launcher_).setTicker(message).setWhen(when) 
  12.                 .setAutoCancel(true).setContentTitle(from) 
  13.                 .setContentText(message) 
  14.                 .setDefaults(Notification.DEFAULT_ALL); 
  15.          
  16.         Intent intent = new Intent(context, ConversationsActivity.class); 
  17.         intent.putExtra("number", number); 
  18.         intent.putExtra("newsms",true); 
  19. //        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
  20. //        stackBuilder.addParentStack(ConversationsActivity.class); 
  21. //        stackBuilder.addNextIntent(intent); 
  22. //        PendingIntent resultPendingIntent = 
  23. //                stackBuilder.getPendingIntent( 
  24. //                        0, 
  25. //                        PendingIntent.FLAG_UPDATE_CURRENT 
  26. //                ); 
  27.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
  28.                 | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
  29.         PendingIntent resultPendingIntent =PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT); 
  30.         mBuilder.setContentIntent(resultPendingIntent); 
  31.         manager.notify((int) System.currentTimeMillis(), mBuilder.build()); 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 сен 2015, 13:50 

Зарегистрирован: 25 янв 2015, 18:57
Сообщений: 42
Благодарил (а): 9 раз.
Поблагодарили: 2 раз.
Kirill, спасибо, помогли!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 окт 2015, 08:44 

Зарегистрирован: 08 янв 2015, 14:32
Сообщений: 115
Благодарил (а): 6 раз.
Поблагодарили: 5 раз.
Kirill, спасибо! оно так быстро всё обновляется, что уследить за всем просто не успеваю(

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2015, 17:55 

Зарегистрирован: 29 окт 2015, 17:51
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте, подскажите пожалуйста, как создать уведомление, которое будет отправляться, если в приложение не заходили сутки(24 часа), на примере кода из данного урока?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 дек 2015, 07:16 

Зарегистрирован: 08 янв 2015, 14:32
Сообщений: 115
Благодарил (а): 6 раз.
Поблагодарили: 5 раз.
Цитата:
как создать уведомление, которое будет отправляться, если в приложение не заходили сутки(24 часа), на примере кода из данного урока?


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 дек 2015, 07:25 

Зарегистрирован: 08 янв 2015, 14:32
Сообщений: 115
Благодарил (а): 6 раз.
Поблагодарили: 5 раз.
ребят, подскажите как отследить, что юзверь сейчас находится в приложении??? мне не нужно его уведомлять, когда он активно юзает прогу.

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 фев 2016, 16:48 

Зарегистрирован: 03 янв 2014, 14:28
Сообщений: 32
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Если использовать notification.setLatestEventInfo(), то при открытии нового Активити метод intent.getStringExtra
возвращает null. А если использовать уже новый код, тогда возвращает то что поместил через putExtra.

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 фев 2016, 22:40 

Зарегистрирован: 08 янв 2015, 14:32
Сообщений: 115
Благодарил (а): 6 раз.
Поблагодарили: 5 раз.
ребят, повторю вопрос, ибо очень актуально!

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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 фев 2016, 16:56 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Если текущая открытая Activity имеет ту же информацию, что и уведомление, то можно не показывать. Если уведомление не имеет отношения к показываемой Activity, то можно и показать. Я лично не показываю только в случае, если открыта активити уведомлений

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 апр 2016, 15:14 

Зарегистрирован: 08 апр 2016, 15:00
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Привет всем! Заранее извиняюсь если пишу не в ту ветку или не туда - на этом форуме я недавно. Я заметил одну интересную особенность контекста и в связи с этим у меня возник вопрос. И так - я использую broadcast reciever из него запускаю сервис который генерироует уведомлени .
уведомлений несколько - и все они имеют внутри интент ссылающийся на определенную активность. Когда я нажимаю на первое уведомление -
все работает хорошо - я перехожу в нужную активность. Но при клике на второе и дальше уведомление - не происходит ничего - создалось впечатление что в них пустые интенты внутри. Что характерно - если запускать этот же сервис с активити - то проблемы нет - каждое уведомление ведет на нужную активность.

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 ноя 2016, 11:50 

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 19:18 

Зарегистрирован: 24 июн 2019, 19:14
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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 }
что делать ?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 154 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB