【问题标题】:noHistory vs finish() - Which is preferred?noHistory 与 finish() - 哪个是首选?
【发布时间】:2014-02-17 22:33:03
【问题描述】:

我不希望我的应用程序在按下back 按钮时显示很少的Activity(比如SplashScreenActivity)。所以我在我的Manifest.xml 中使用了noHistory=true 作为Activity,如下所示:

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

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

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

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

【问题讨论】:

  • 请注意 noHistory 也有“副作用” - 当您将 noHistory 活动置于后台(例如按下 Home 按钮)当用户返回它时(通过“最近的应用程序”),它不会显示
  • 亲爱的@MarianPaździoch 当用户同时按下主页和返回按钮时,我们如何终止应用程序?因为当用户按下主页按钮时,我的 Google TTS 和 Locale 库出现故障。 android:noHistory="true" 的清单代码仅修复了用户按下返回按钮时的问题,但主页按钮仍然存在错误。谢谢。
  • android:excludeFromRecents="true" 这将在按下设备上的主页和返回按钮时终止应用程序似乎从未打开过:D

标签: android back-stack activity-stack


【解决方案1】:

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

noHistory 应该可以很好地为您服务,但是您可以在启动新的Activity 后立即在您的Activity 中调用finish() 来获得类似的行为。但是,noHistory 最终更易于维护,因为如果您稍后将另一个 startActivity() 调用添加到您的 SplashActivity,您最终可能会忘记包含 finish() 调用。

【讨论】:

  • 值得注意的是,在清单中使用noHistory = true 声明的缺点之一是,如果您的 noHistory 活动启动了第 3 方意图(相机、谷歌登录等),那么当用户按下后退按钮,他们无法返回他们刚刚使用的启动第 3 方窗口的活动,他们将返回设备的主屏幕。
【解决方案2】:

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

noHistory 的好处在于,系统负责在正确的时刻完成活动(如您所见here,系统实际上会调用finish()方法),这样你就可以确保你没有在糟糕的时刻调用它,并且一切都是安全的(现在这似乎并不重要,但它可能是,例如在使用线程时)

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

【讨论】:

  • 我的行为正是你在上一段中解释的行为,这让我发疯了哈哈我想看看这是正常行为,但我在任何地方都找不到。谢谢! PS:仔细想想,使用 noHistory 或 finish() 和有些人说的不一样。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2015-11-15
      • 2020-06-04
      • 2010-10-03
      • 2011-03-30
      • 2011-09-11
      • 2016-03-29
      • 2020-08-10
      • 2010-10-03
      相关资源
      最近更新 更多