23

我不希望我的应用程序在按下按钮时显示很少Activity(比如说)。所以我已经在我的 for that中使用了,如下所示:SplashScreenActivitybacknoHistory=trueManifest.xmlActivity

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

除了设置noHistory,我还可以调用finish()我的SplashActivity.onPause()方法或任何我想要的地方,如下所示:

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

两者都完美地完成了这项工作。但是哪个更好用,使用noHistory还是调用finish()

4

4 回答 4

27

onPause()根本不是finish()为您的活动打电话的好地方。onPause()可以出于多种原因调用,我怀疑您的用户会很高兴看到他们所做的任何事情都被您的应用程序忘记了,例如,如果他们关闭并重新打开屏幕。

noHistory应该可以很好地为您服务,但是您可以通过finish()Activity启动新的Activity. 但是,noHistory最终更易于维护,因为finish()如果您稍后添加另一个startActivity()调用,您最终可能会忘记包含该调用SplashActivity

于 2014-01-27T07:23:43.690 回答
8

如果你想调用finish(),你应该在调用之后startActivity调用,如果你在任何生命周期回调中调用,正如 NasaGeek 所说,它可以在不同的时刻调用,而不仅仅是在导航到其他活动时调用。

的好处noHistory系统负责在正确的时刻完成活动(如您在此处阅读的,系统实际上会为您调用 finish() 方法),因此您可以确定您没有调用它在一个糟糕的时刻,一切都是安全的(现在这似乎并不重要,但它可能是,例如在使用线程时)

此外,它的好处是,活动不仅在您启动另一个活动时完成,而且在任何其他情况下,当用户导航离开它并且活动不再在屏幕上可见时,例如当用户按下后退按钮(如您所愿)或当另一个活动进入前台时

于 2014-01-29T10:21:17.617 回答
0

当活动进入后台时,不要使用 onPause()。这种情况可以是任何时候,例如意图或弹出消息(自定义)。最好使用另一个选项,而不是玩活动的生命周期。nohistory 选项,如果它适合你,那就太好了。您也可以尝试关注,

<activity
    android:name="com.gokul.SplashScreenActivity"
    android:launchMode="singleTask"
    android:clearTaskOnLaunch="true"/>
于 2014-01-31T08:48:57.480 回答
0

当您使用 noHistory 时,当您请求对该活动的权限时,可能会出现一些奇怪的问题。

在三星 Galaxy S5(Android 6) 上,显示权限对话框时将关闭活动

于 2019-05-14T06:51:39.420 回答