2015-11-03 2 views
12

В Android, если вы хотите очистить текущий стек Activity и запустите новый Activity (например, выйдите из приложения и запустив журнал в Activity), похоже, есть два подхода.Activity.finishAffinity() vs Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

Есть ли какие-либо преимущества для одного над другим, если ваш целевой уровень API выше 16?

1) Отделка Affinity

Вызов finishAffinity() от деятельности. Activity.finishAffinity

2) Намерение Флаги

Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 
finish(); 

finishAffinity() подход пригоден для> = API 16.

The Intent флагов подход пригоден для> = API 11.

Чтобы быть ясными, с целью очистки текущего стека Activity оба подхода выглядят одинаково одинаково. Мой вопрос в том, есть ли проблемы с тем, что люди испытали, и, следовательно, есть ли какие-либо причины выбирать один над другим?

ответ

10

Функционально, нет никакой разницы, но тестирование этого на GenyMotion, как представляется, небольшая визуальная разница. См. Веб-листинг: https://drive.google.com/file/d/0B8Y77sY7Y2CGRS02c3UyNjd2MGs/view?usp=sharing

Вам нужно будет попробовать это на нескольких устройствах, чтобы увидеть, насколько это согласовано.

Субъективно, я бы сказал, пойдите с finishAffinity(), потому что это более явным. Однако, если вам нужно поддерживать < SDK 16, у вас действительно нет выбора.

+0

Задержка или мерцание, о котором вы упоминаете, изначально сделало меня вопросом finishAffinity(). IIRC, некоторые устройства Samsung, в частности, имели очень выраженное мерцание при использовании функции finishAffinity(), но у меня больше нет устройств для тестирования. –

+0

В этом случае это была версия намерения, которая имела мерцание в соответствии с видео. – brindy

+0

На самом деле, я не уверен, что назову это мерцанием (на основе видео). Однако, что-то определенно отличается от того, что происходит визуально. finishAffinity выглядит как сверху, версия намерения выглядит так, как будто она «закончила», открывая другую в верхней части стека. – brindy

0

Для этого вы должны использовать флаги намерений.

Что делать, если у вас есть большой стек действий, вы можете позвонить от каждого, чтобы закончить их все?

Его намного лучше и проще просто назвать намерение.

Надеюсь, это поможет.

+0

Цель обоих подходов, перечисленных в моем вопросе, чтобы закончить все действия в текущем стеке без вызова Finish() на каждом из них в отдельности. Чтобы быть ясным, насколько я вижу, оба подхода достигают этого. –

0

Попробуйте

Intent.FLAG_ACTIVITY_CLEAR_TOP 

он очищает стек предыдущих мероприятий