详细的Android活动生命周期(onAttachedToWindow())

10

我对安卓Activity生命周期很感兴趣,想要获得更详细的描述/文档/参考资料,而不仅仅是广泛可用的基础(onCreate->onStart->onResume)文档

我的需求来自于意识到如果将新的Activity(使用Theme.Dialog风格)从onAttachedToWindow()中启动,相比从onCreate()中启动可以极大地提高响应时间。我想知道onAttachedToWindow()如何适应整个安卓Activity生命周期。官方API文档中的描述"Called when the window has been attached to the window manager"并没有太大帮助。


如果你想看看它与其他方法的配合情况,你可以重写每个方法并添加一些打印语句。 - Cheryl Simon
是的,我已经做到了(onAttachedToWindow()在onResume()之后执行)。但这并不能回答“到底发生了什么?”和“为什么响应速度会有如此大的差异?”的问题。 - Ralkie
OnCreate事件何时开始运行?当我在OnCreate事件的开头设置断点,应用程序运行并将活动加载到屏幕上,然后断点激活,应用程序进入暂停状态。我需要一个关于活动的事件,在活动初始化和启动之前准确激活。 - Mohammad Afrashteh
2个回答

6

我猜测为什么这种方式感觉更加响应,可能是因为当您从Activity A的onCreate()启动Activity B时,Activity A在Activity B启动之前没有被绘制,这可能需要另外一秒或两秒(使应用程序感觉不太响应)。而如果您在Activity A的onAttachedToWindow()中启动Activity B,则在启动B之前会启动和渲染A,因此用户不必在看到对其操作的反应之前等待一秒钟空白屏幕或预先-A的活动。


你的解释似乎与正在发生的事情相符,但我仍然不明白为什么做更多的工作(pre-A > A.onCreate(),A.onStart(),A.onResume(),A.onAttachedToWindow() > B)比从A.onCreate()开始启动B(pre-A > A.onCreate() > B)更快。从pre-A到B的加载时间分别为<1s和~7s。 - Ralkie

-3
当Activity启动时,会调用onCreate()方法。在onCreate()方法中,您可以执行基本的启动逻辑,这些逻辑只应该在整个Activity的生命周期中发生一次。
在执行完onCreate()方法后,会调用onStart()方法。此方法使Activity成为可见状态,因为应用程序正在准备将其进入前台并变得与用户交互。
在执行完onStart()方法后,会调用onResume()方法。此方法仅在应用程序处于前台时才调用,因为在此状态下应用程序与用户进行交互。应用程序将保持恢复(或运行)状态,直到发生某些事件将焦点从应用程序中移开。
如果另一个Activity进入前台,则会调用onPause()方法。如果应用程序仍然可见,则暂停应用程序。此方法仅暂停Activity的操作,而不销毁Activity。Activity将保持暂停状态,直到Activity恢复或完全不可见为止。 4a. 如果用户返回到该Activity,则会再次调用onResume()方法。 4b. 如果具有更高优先级的应用程序需要内存,则可以从暂停状态杀死应用程序进程。如果用户需要在杀死应用程序后返回到应用程序,则会再次调用onCreate()方法。
如果Activity对用户不再可见,则会调用onStop()方法。当Activity停止时,Activity对象将保留在内存中,并且维护所有状态和信息,但未连接到窗口管理器。 5a. 如果用户返回到该Activity,则会调用onRestart()方法,然后再次调用onStart()方法。 5b. 如果具有更高优先级的应用程序需要内存,则可以从停止状态杀死应用程序进程。如果用户需要在杀死应用程序后返回到应用程序,则会再次调用onCreate()方法。
如果Activity正在完成或被系统销毁,则会调用onDestroy()方法。应用程序最初不会关闭。系统会调用此方法,因为Activity由于某人调用了finish()而完成,或者因为系统暂时销毁包含Activity的进程以节省空间。系统也可能在发生方向更改时调用此方法,然后立即调用onCreate()以在新方向中重新创建进程及其中包含的组件。 onDestroy()方法释放所有尚未被之前的方法(如onStop())释放的资源。

整个生命周期的活动发生在第一次调用onCreate()到最后一次调用onDestroy()之间。

可见生命周期的活动发生在调用onStart()到调用onStop()之间。

前台生命周期的活动发生在调用onResume()到调用onPause()之间。

我们必须实现的唯一方法是onCreate()。其他方法会自动调用。但我们可以自己实现它们,告诉应用程序在这些过程中要做什么。

https://developer.android.com/guide/components/activities/activity-lifecycle.html#asem

onAttachedToWindow 在视图附加到窗口时被调用。此时它具有一个 Surface 并将开始绘制。

https://developer.android.com/reference/android/view/View.html#onAttachedToWindow()


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