Android:finish()后是否保证调用onPause()?

9

我在任何地方都找不到一个确定的答案。我有一个方法,其中调用finish(),然后调用onPause()。

调用finish()后,是否保证会调用onPause()?

4个回答

18

如果您在Activity的生命周期中某个时刻调用finish(),则Android通常会调用onPause(),除非您在onCreate()中调用finish()

public class MainActivity extends ActionBarActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    finish();
  }



  @Override
  protected void onPause() {
    super.onPause();
    Log.d(TAG, "onPause");
  }

  @Override
  protected void onStop() {
    super.onStop();
    Log.d(TAG, "onStop");
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy");
  }
}

运行一下代码,观察日志,你会发现只有 "onDestroy" 被记录了。如果在其他位置调用 finish() ,你会看到 onPause() 方法被调用。


3
只是出于好奇,你是怎么找到这个的?你之前有阅读过相关的资源,还是有一天你只是试着调整了一下代码?真是一个非常特殊的情况。谢谢。 - Kacy

6
该系统调用此方法作为用户离开您的活动的第一个指示(尽管这并不总是意味着正在销毁活动)。这通常是您应该提交任何应在当前用户会话之外持久保存的更改的地方(因为用户可能不会回来)。所以onPause()是有保证的。官方文档在此
编辑1: onCreate()对应onDestroy()onStart()对应onStop()onResume()对应onPause()。当onCreate()完成其工作时,将调用onStart()。如果没有调用,则不会调用。 onResume()表示UI即将显示给用户-(Activity的内容是用户看到的屏幕)。 如果在onCreate()中直接调用finish(),则onPause()将被跳过,因为从未调用onResume(),同样适用于onStart()。因此,在某些情况下,您可以说它不是;但那是错误的,因为什么是不作为屏幕或用作屏幕容器的Activity(片段)。

为什么要直接在Activity的onCreate()中调用finish()?从Activity通常工作的方式来看,onPause()将始终保证被调用。


我以为finish()可能会绕过onPause()的调用,感谢澄清。 - Kacy
算了,显然有一些情况下 onPause() 方法不会被调用。 - Kacy
场景不合法,即如果您有一个合法的活动...请检查我的编辑@KacyRaye。 - Elltz

3
是的,当您的活动即将消失时,会调用onPause。

0

虽然有点晚了,但可能会对未来的访问者有所帮助。

我在按照这个教程为我的应用程序制作启动画面时,遇到了onPause()没有被调用的问题。

经过一些尝试和强迫自己思考,我找到了原因!onCreate()方法看起来像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
    finish();
}

因此,在活动有机会开始或恢复之前,我强制结束它,从而绕过了其他状态方法的调用!

但据我所知,根据官方Activity文档,在任何其他情况下(至少是正常情况下!),onPause()方法都是有保证被调用的!


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