无历史记录(noHistory)与finish() - 哪个更好?

24

当用户按下“返回”按钮时,我不希望我的应用程序显示某些Activity(例如SplashScreenActivity)。因此,我在我的Manifest.xml中为该Activity使用了noHistory=true,如下所示:

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

我可以在SplashActivity.onPause()方法中或任何其他想要的地方调用finish(),而不是设置noHistory,如下所示:

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

两种方法都可以完美地完成工作。但是,使用 noHistory 还是调用 finish() 更好呢?


4
请注意,noHistory 还具有“副作用”- 当您将 noHistory 活动放到后台(例如按 Home 按钮)时,当用户通过“最近使用的应用程序”返回到它时,它将不会显示。 - Marian Paździoch
亲爱的@MarianPaździoch,当用户同时按下Home和Back按钮时,我们该如何终止应用程序?因为当用户按下Home按钮时,我的Google TTS和Locale库出现了故障。在Android清单代码中添加android:noHistory="true"只能解决用户按下Back按钮的问题,但Home按钮仍然存在故障。谢谢。 - Bay
android:excludeFromRecents="true" 这将在设备上按下主页和返回按钮时终止应用程序,就好像应用程序从未打开过:D - Bay
4个回答

27

onPause()不是一个很好的地方来放置finish()调用你的活动。 onPause()由于各种原因可能会被调用,如果用户关闭并重新打开屏幕,你的应用程序突然忘记他们正在做什么了,我怀疑你的用户肯定不会太高兴。

noHistory应该可以满足你的需求,但是你也可以在你的Activity 在启动新的Activity之后立即调用finish()以获得类似的行为。 然而,最终使用noHistory更容易维护,因为如果你以后向SplashActivity添加另一个startActivity()调用,你可能会忘记包含finish()调用。


1
值得注意的是,在您的清单中使用noHistory = true声明的缺点之一是,如果您的noHistory活动启动第三方意图(相机、谷歌登录等),当用户按返回按钮时,他们不能返回到刚才启动第三方窗口的活动,而是返回到设备的主屏幕。 - Cody

8
如果您想调用finish(),您应该在调用startActivity后执行,如果您在任何生命周期回调中执行它,如NasaGeek所说,它可能会在不同的时刻被调用,而不仅仅是在导航到其他活动时。 noHistory的好处是,系统会在正确的时刻结束活动(正如您可以在这里阅读到的那样,系统实际上会为您调用finish()方法),因此您可以确信您不会在错误的时刻调用它,一切都是安全的(也许现在看起来不重要,但在使用线程时可能很重要)。
此外,好处是活动不仅在启动另一个活动时结束,而且在用户导航离开它并且活动不再在屏幕上可见时,在任何其他情况下也会结束,例如当用户按下返回按钮(正如您所希望的那样)或者另一个活动进入前台。

1
我遇到了你在最后一段解释的行为,它让我发疯了,哈哈。我想看看这是否是正常的行为,但我找不到任何东西。谢谢!附言:如果您考虑一下,使用noHistory或finish()与某些人说的不同。 - Kaizie

0

不要使用onPause(),因为它会在活动进入后台时调用。而这种情况可能随时发生,例如在意图或弹出消息(自定义)上。 最好使用另一个选项,而不是玩弄活动的生命周期。 如果nohistory选项适合您,那就很好。您也可以尝试以下内容,

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

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接