Как определить что Activity уже запущена?

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Как определить что Activity уже запущена?

Сообщение grem17 » 14 янв 2015, 10:08

Всем привет
вопрос такой - в классе надо сделать разветвление:
1) если активити не существует - то создать ее
2) если существует - то изменить находящийся в ней TextView

не могу понять как именно сделать такое разветвление?

что то типа:
if activity.существует==true {
bla-bla-bla
}else{
bla-bla-bla
}

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как определить что Activity уже запущена?

Сообщение KamiSempai » 16 янв 2015, 14:53

Это делается через флаги при запуске Activity. Кажется Intent.FLAG_ACTIVITY_SINGLE_TOP.
Если использовать этот флаг, и Activity уже запущена и отображается на экране, Новая Activity не запустится, а вызовется метод onNewIntent в ранее запущенной Activity.

Если Activity находится не на верху стека(скрыта другой Activity) можно попробовать добавить флаг FLAG_ACTIVITY_REORDER_TO_FRONT. На счет этого я не уверен, не пробовал.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как определить что Activity уже запущена?

Сообщение Foenix » 18 янв 2015, 22:24

Для того, чтобы запустить активити, или вывести активити наверх из стека, если оно уже запущено - использовать флаг NEW_TASK_LAUNCH в методе startActivity()
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 19 янв 2015, 12:40

а как запустить activity из BroadcastReceiver с параметром Intent.FLAG_ACTIVITY_SINGLE_TOP?

у меня не получается, работает только вот такой вариант с Intent.FLAG_ACTIVITY_NEW_TASK

Intent mIntent;
mIntent = new Intent(intent.ACTION_MAIN, null, context, SmsWindow.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mIntent.putExtra("NomerSMS", NomerSMS);
mIntent.putExtra("BodySMS", BodySMS);
mIntent.putExtra("TimeSMSsent", TimeSMSsent);
mIntent.putExtra("TimeNow", TimeNow);
mIntent.putExtra("ServCentr", ServCentr);
context.startActivity(mIntent);

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как определить что Activity уже запущена?

Сообщение KamiSempai » 19 янв 2015, 13:29

R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 19 янв 2015, 13:53

вот так объявлен в манифесте

<activity android:name=".SmsWindow"
android:label="@string/title_sms_window"
android:theme="@android:style/Theme.Dialog"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="standard">
</activity>

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 20 янв 2015, 10:00

KamiSempai писал(а):Это должно помочь http://developer.android.com/reference/ ... entFilter)
прочитал ссылку, понятнее не стало :)
регистрация широковещательных сообщений может быть произведена как в программе, так и в манифесте (у меня через манифест), а как корректно вызвать из броадкаста (или любой другой функции) активити, причем несколько раз (первый раз активити просто запускается, второй и последующие - в ней обновляется инфа) - это не понятно

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 20 янв 2015, 11:04

похоже разобрался, по крайней мере тест отработал

1) в манифесте вызываемую активити прописал вот с такими параметрами
<activity android:name=".SmsWindow"
android:label="@string/title_sms_window"
android:theme="@android:style/Theme.Dialog"
android:launchMode="singleTop">
</activity>

2) в Broadcast вызов активити сделал следующим образом
mIntent = new Intent(context, SmsWindow.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mIntent.putExtra("NomerSMS", NomerSMS);
mIntent.putExtra("BodySMS", BodySMS);
context.startActivity(mIntent);

3) в вызываемой активити переопределил метод
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
Log.d(MyLog, "----------------------ТЕСТ---------------------------");
}

все работает, спасибо что помогли разобраться, буду дальше кодить :)

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 23 янв 2015, 11:24

возник еще один вопрос по этой же теме

1) приложение ЗАПУЩЕНО
- поступает смс, броадкаст его перехватывает и запускает окно с активити, отрабатывает метод onCreate() (окно я не закрываю)
- поступает второе смс, броадкаст его перехватывает, запускает активити, в нем уже отрабатывает другой метод onNewIntent()
тут все хорошо...

2) приложение ЗАКРЫТО
- поступает смс, броадкаст перехватывает, стартует активити (я его так же не закрываю), стартует метод onCreate
- поступает вторая смс, броадкаст его перехватывает...и все...метод onNewIntent() не запускается, почему так?

сделал логи с выводом в LogCat, видно что запуск активити из броадкаста отрабатывает, но ни чегоне происходит

на всякий случай выложу код
Манифест, так обозначен вызываемый класс
<activity android:name=".SmsWindow"
android:label="@string/title_sms_window"
android:theme="@style/AppTheme"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop">
</activity>

вот так он вызывается из броадкаста
mIntent = new Intent(context, SmsWindow.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mIntent.putExtra("NomerSMS", NomerSMS);
mIntent.putExtra("BodySMS", BodySMS);
mIntent.putExtra("TimeSMSsent", TimeSMSsent);
mIntent.putExtra("TimeNow", TimeNow);
mIntent.putExtra("ServCentr", ServCentr);
context.startActivity(mIntent);

вот так в нем прописан метод onNewIntent
protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
//бла-бла-бла
}

закрытие активити происходит через метод finish()

grem17
Сообщения: 85
Зарегистрирован: 16 сен 2014, 11:54

Re: Как определить что Activity уже запущена?

Сообщение grem17 » 23 янв 2015, 13:20

хм, вопрос снят
проблема решилась всего лишь заменой
singleTop на singleTask в манифесте

Ответить