Activity的生命周期之Stopping(停止) 和 Restarting(重启)

停止(stopping)和重启(restarting)是activity生命周期中很重要的过程,只有恰当的处理停止和重启过程才能让用户认为你的app始终是连贯的运行着的,在这两个过程之间 用户并不会觉得自己的操作被中断过。以下是stopping和restarting这两个过程发生的典型场景:

  • 用户打开最近使用的app窗口(4.0以上版本点击三个虚拟键的第三个键),从当前的app切换到其他app,那么切换之前的原本获得焦点的app 就被stop了。如果用户再次从launcher中点击原来的app图标或者从最近使用的app窗口窗口中回到你的activity,那么原来的activity就重启(restarts)了。

  • 用户在在一个activity中调用第二个activity,那么第一个activity就处于stop状态,第二个activity被创建。如果这时用户点击back 那么第一个activity就再次重启(restarted)。

  • 用户在使用app的过程中接到电话。

译者注:停止(stopping)和重启(restarting)的翻译似乎会引起误解,这里的重启并不是退出程序,而是指重新调用。但是根据字面上来看,确实是重启的意思。

Activity提供了两个生命周期函数onStop()和onRestart()来处理停止和启动这两个过程。 不同于pause状态的activity,stopped强调这个activity是完全不可见的,用户的焦点转移到了独立的另一个activity之上,而pause状态中 activity只是部分不可见,被暂停了,暂停他的视图很可能还是依附于这个activity之上。

**注:**因为系统在activity stopped的时候内存中还保持这activity的实例,所以对于简单的程序而言,你即使不实现onStop()onRestart()方法,对于比较简单的activity来说 ,停止和重启这两个过程都会顺利的执行,且程序不会出现什么错误。你只需注意在onStop的时候释放掉暂时不用的资源就ok了。

**图 1.**当用户离开activity的时候,系统调用onStop()来停止这个activity (1). 如果用户在这期间回到activity,系统调用onRestart()方法 (2), 然后马上调用onStart()(3) 接着调用onResume()(4). 注意到不管是何种情况导致activity处于stop状态,系统都会在onStop()之前调用onPause()

Stop 你的 Activity

当activity收到系统对onStop()方法的调用,activity将不可见,并且你应该释放掉用户在此时不需要的所有资源。 如果有必要恢复内存,系统可能会销毁(通过onDestroy()方法)处于stop状态的activity,更极端的情况是,系统不调用你activity的 onDestroy(),直接杀死你的app进程,因此在onStop()中释放可能导致内存泄漏的资源是非常重要的。(自己主动清理要比系统扫荡式的清理安全得多)。