Activity生命周期和启动模式介绍

325 阅读5分钟

Activity生命周期和启动模式

Activity总的来说有五种状态:

  1. 启动状态: Activity的启动状态很短暂,当Activity启动后便会进入运行状态。
  2. 运行状态(running): 如果一个Activity在栈的最顶层,并且处于屏幕的可见状态,可与用户进行交互。
  3. 暂停状态(paused): 如果一个Activity已经失去焦点,但是仍然可见(一个不是全屏的Activiy或者透明的Activity放置在栈顶时),这时就处于paused状态,此时只是失去了和用户交互的能力,所有的状态信息,成员变量还都保存着,它将在系统内存极低的状态下被系统回收掉。
  4. 停止状态(stopped): 如果一个activity被另外一个Activity完全覆盖,这时就处于stopped状态,它仍然保持所有的状态和成员信息,此时它不再可见,当系统需要更多的内存的时候,此时会被系统回收。
  5. 销毁状态(killed): 当系统被activity回收掉或者Activity从来没有创建过,Activity就处于killed状态。

Activity的生命周期回调方法:

  1. onCreate(): 在Activity第一次被创建的时候调用。可以在onCreate方法中完成Activity的初始化操作。
  2. onStart(): 在 Activity 即将对用户可见之前调用。
  3. onResume(): 此方法在Activity准备好和用户进行交互的时候调用,此时的activity一定处于栈的栈顶,并且处于运行状态
  4. onPause(): 此方法在系统准备启动或者恢复另一个Activity的时候调用。可以在此方法中将一些消耗cpu的资源释放掉,以及保存一些关键的数据,但是这个方法的执行一定要快,不然会影响到新的栈顶Activity的使用。
  5. onStop(): 此方法在Activity完全不可见的时候调用,它和onPause( )方法的区别在于,如果启动的新的Activity是一个对话框的活动,那么onPause( )方法会得到执行,而onStop( )方法不会执行。
  6. onDestroy(): 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 isFinishing() 方法区分这两种情形。
  7. onReStart(): 在 Activity 已停止并即将再次启动前调用。

一般来说,当系统调用onPause()和onStop()方法后的Activity 实例仍然存在与内存当中,当Activity重新回到前台的时候,之前的状态会得到保留,但是当系统内存不足时,调用过onPause()和onStop()方法后的Activity可能会被系统进行回收,此时再重新回到前台,之前的所有状态就会消失,为了避免这种情况的发生可以调用onSaveInstanceState()方法来保存之前的状态。

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出Activity时, 用户显然想要关闭这个Activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.

Activity的启动模式

四种启动模式:

  1. standard(默认的启动模式): 每次启动该模式Activity都会创建新的实例
  2. singleTop(栈顶复用模式): 如果启动的Activity在栈顶并且处于该模式,不会再创建新的实例,并且会回调
    该方法。这种启动模式一般使用于接收到消息后显示的界面,例如QQ接收到消息后弹出Activity,或者当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!
  3. singleTask(栈内复用模式): SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。这种启动模式一般使用在返回主页
  4. singleInstance(单实例模式): SingleInstance比較特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。这个经常使用于系统中的应用,比如Launch、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。

启动模式的使用方式:

  1. 在 Manifest.xml中指定Activity启动模式,属性launchMode可以设置。(静态)
  2. 启动Activity时。在Intent中指定启动模式去创建Activity,通过Intent的addFlags方法去动态指定一个启动模式。(动态)

倆者的区别:

(1)优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。

(2)限定范围:第一种方式无法为Activity直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,另外一种方式无法为Activity指定 singleInstance 模式。

Activity 的 Flags:

1. FLAG_ACTIVITY_NEW_TASK

作用是为Activity指定 “SingleTask”启动模式。跟在AndroidMainfest.xml指定效果同样。

2. FLAG_ACTIVITY_SINGLE_TOP

作用是为Activity指定 “SingleTop”启动模式,跟在AndroidMainfest.xml指定效果同样。

3. FLAG_ACTIVITY_CLEAN_TOP

具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用

4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。它等同于在xml中指定Activity的属性: