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) активность закрывается при отображении диалога разрешений