А на самом деле не так все просто.neoksi писал(а):Вот сам сегодня с этим же столкнулся, решение тут: viewtopic.php?f=35&t=1159etlt писал(а):Подскажите: как при клике на уведомление вызвать тот же самый экземпляр Activity?
Опишу проблему: Из активити запускается сервис который вызывает уведомление, однако при клике на уведомление открывается тоже самое Активити, НО новое т.е. в итоге имеем 2 одинаковые запущенные активи, а нужно чтобы из уведомление вызывалось только 1 активити
Если в манифесте для активити прописать 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() мы получим уже новый интент. С нашими экстра.