Activity状态和生命周期

Activity状态

Activity有多种状态,并且在这些状态之间可以相互切换,从而控制自己的生命周期。

  • Resumed

这个状态的Activity处于Activity任务栈的最顶层,对用户可见,并且具有焦点,能与用户进行交互。

  • Paused

当Activity失去焦点,被一个非全屏的或者透明的Activity覆盖时,Activity就处于Paused状态。这时,Activity不能与用户进行交互,但是,其状态信息、成员变量等还被系统保持着,只有在系统内存将要耗尽时,才会被系统回收。

  • Stopped

当Activity被另一个Activity完全覆盖时会进入到Stopped状态,这时,Activity不可见,但也保持了所有的状态信息和成员变量,不过,相比Paused状态,系统会优先回收Stopped状态的Activity。

  • Destroyed

当Activity被系统回收或调用finish()方法后,Activity就处于Destroyed状态。

Activity生命周期

下面以一张图来展示Activity生命周期(来自于Android官方文档):

Activity生命周期

Activity启动和销毁过程

当系统启动Activity时,首先调用onCreate()之后,接着调用onStart(),然后调用onResume()进入Active/Running状态。

当系统销毁Activity时,如果是正常的销毁流程,会依次调用onPause()、onStop()和onDestory(),让Activity回到Destroyed状态;如果是系统回收内存资源进行的销毁,可能不会调用onDestory()甚至onStop()方法。

根据Activity启动和销毁过程,可以在相关方法中做一些特定操作:

  • onCreate():创建UI并加载数据,开启后台线程,初始化成员变量。
  • onDestory():释放所有还保留着的系统资源,特别注意要关闭开启的后台线程(对象引用在Activity销毁时会自动清除,但是线程不会)。

Activity暂停和恢复过程

Activity暂停时会调用onPause()方法,暂停结束后,会调用onResume()方法恢复Activity的状态。

根据Activity暂停和恢复过程,可以在相关方法中做一些特定操作:

  • onPause():暂停不需要在Paused状态运行的操作,比如Music、Video和Animation等,释放不需要在Paused状态使用的系统资源,比如Camera、Sensor、Receivers等;注意onPause()方法运行时间比较短,不要在里面做耗时操作,比如保存数据、请求网络、执行数据库事务等,不过,可以在onStop()方法中做这些耗时的操作。
  • onResume():开启onPause()中暂停的操作,重新初始化onPause()中释放的资源。

Activity停止和重新启动过程

当Activity处于Paused状态时,通常会有两种可能:调用onResume()方法恢复Activity;调用onStop()方法,停止Activity。

Activity停止后会处于后台,如果要重新启动,会调用onReStart()和onStart()方法。

根据Activity停止和重新启动过程,可以在相关方法中做一些特定操作:

  • onStop():释放几乎所有系统资源,因为大部分系统资源在Activity不可见时不会再使用,比如注销在onStart()中开启的,能够影响UI的Receivers;特别要注意释放那些可能造成内存泄露的系统资源,因为系统可能会在内存不足的时候跳过onDestory()方法销毁Activity;另外,还可以做一些耗时的关闭操作,比如保存用户的草稿数据到数据库中。
  • onReStart():只有在从后台恢复到前台时才会调用onReStart()方法。
  • onStart():初始化一些影响UI系统资源,比如注册能够影响UI的Receivers等。

Activity重新创建过程

当Activity处于Paused或Stopped状态时,系统会因为内存不足回收Activity,这时,系统会将Activity的状态通过onSaveInstanceState()方法保存到Bundle对象中。当重新创建Activity时,Bundle对象会被传递到onRestoreInstanceState()和onCreate()方法中,这样就可以通过Bundle对象恢复Activity的状态。Android系统已经默认实现了系统控件的状态保存和恢复,不过只支持提供了android:id属性的View。

只有当前Activity离开前台,并且有被销毁的可能时,才会调用onSaveInstanceState()方法,如果调用finish()方法正常结束Activity的时候,该方法不会被调用。

另外,当系统配置改变时,Activity也会被重新创建,这时会调用onConfigurationChanged()方法。比如,在横竖屏切换时,系统会调用onSaveInstanceState()方法保存状态数据,然后,根据新的配置去恢复Activity的状态。

onSaveInstanceState()方法一般用来保存Activity的状态数据,如果要保存需要持久化的数据,应该在Activity在前台的时候,寻找合适的时机去保存,如果找不到合适的时机,可以在onStop()方法中进行。

onSaveInstanceState()方法会在onPause()方法之后、onStop()方法之前调用;onRestoreInstanceState()方法会在onStart()方法之后调用。

坚持原创技术分享,您的支持将鼓励我继续创作!