NoHistory vs finish() - Что предпочтительнее?

Я не хочу, чтобы мое приложение показывало несколько Activity (например, SplashScreenActivity) при нажатии кнопки back. Поэтому я использовал noHistory=true в своем Manifest.xml для этого Activity как показано ниже:

<activity
    android:name="com.gokul.SplashScreenActivity"
    android:noHistory="true" >
</activity>

Вместо установки noHistory я также могу вызвать finish() в моем методе SplashActivity.onPause() или где захочу, как показано ниже:

@Override
protected void onPause() {
    super.onPause();
    finish();
}

Оба делают работу отлично. Но какой из них лучше использовать, использовать noHistory или вызвать finish()?

Ответы

Ответ 1

onPause() вовсе не является хорошим местом для вызова finish() для вашей активности. onPause() можно вызвать по разным причинам, и я сомневаюсь, что ваши пользователи будут очень рады видеть, что все, что они делали, было просто забыто вашим приложением, если они, например, выключили экран и снова включили его.

noHistory должен служить вам очень хорошо, но вы можете получить аналогичное поведение, вызвав finish() в свой Activity сразу же после запуска нового Activity. Тем не менее, noHistory в конце концов более удобен в обслуживании, потому что вы можете забыть включить вызов finish(), если позже добавить еще один startActivity() вызов к SplashActivity.

Ответ 2

Если вы хотите вызвать finish(), вы должны сделать это после вызова startActivity, если вы делаете это в любом из обратных вызовов жизненного цикла, как говорит NasaGeek, его можно вызывать в разные моменты, а не только при переходе к другому действию.

Хорошая вещь noHistory состоит в том, что система позаботится о завершении действия в нужный момент (как вы можете прочитать здесь, система фактически вызовет для вас метод finish()), так что вы можете быть уверены, что не вызываете это в плохой момент, и все безопасно (вероятно, это сейчас не кажется важным, но это может быть, например, при работе с потоками)

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

Ответ 3

Не используйте onPause() как вызывается, когда действие идет в фоновом режиме. И этот случай может быть в любое время, например, о намерении или всплывающем сообщении (на заказ). Лучше использовать другой вариант, а не играть с жизненным циклом деятельности. Опция nohistory, если она у вас работает, то это приятно. Вы также можете попробовать следовать,

<activity
    android:name="com.gokul.SplashScreenActivity"
    android:launchMode="singleTask"
    android:clearTaskOnLaunch="true"/>

Ответ 4

Когда вы используете noHistory, могут возникнуть странные проблемы, когда вы запрашиваете разрешения для этого действия.

На Samsung Galaxy S5 (Android 6) активность закрывается при отображении диалога разрешений