Activity

Activity 的生命周期

Activity 的生存期

onCreate –> onStart –> onResume –> onPause –> onStop –> onDestroy

  1. onCreate() 完成初始化操作,如:加载布局,绑定事件。

  2. onStart() 不可见变为可见时候调用。

  3. onResume() 准备和用户进行交互的时候调用

  4. onPause() 当系统准备去启动或者回复另一个 Activity 的时候调用。通常在这个方法将一些消耗 GPU 的资源释放掉(如OpenGL ES 中要在这个方法中调用 glSurfaceView.onPause())以及保存一些关键数据,但在这个方法中的执行速度要快。

  5. onStop() 在完全不可见的时候调用,和 onPause() 方法的区别在于,如果启动的是对话框式的活动,那么执行 onPause() 方法,不执行 onStop().

  6. onDestroy() 在 Activity 被销毁之前调用,之后 Activity 的状态变为销毁转态。

  7. onRestart() 这个方法在 Activity 由停止状态变为运行状态之前调用。

Activity 的其他方法

stormzhang 更详细的介绍

  • onContentChanged、onPostCreate、onPostResume、onConfigurationChanged、onSaveInstanceState、onRestoreInstanceState

过程

onCreate –> onContentChanged –> onStart –> onPostCreate –> onResume –> onPostResume –> onPause –> onStop –> onDestroy

  • onSaveInstanceState、onRestoreInstanceState

特定场景下 Activity 的生命周期

  • 首次启动 onCreate –> onStart –> onResume
  • 按下返回键 onPause –> onStop –> onDestroy
  • 按 home 键 onPause –> onSaveInstanceState –> onStop
  • 再次打开 onRestart –> onStart –> onResume
  • 屏幕旋转
  • FirstActivity打开SecondActivity

Activity 的启动模式

4个模式

activity有四种启动模式,分别为standard,singleTop,singleTask,singleInstance。如果要使用这四种启动模式,必须在manifest文件中标签中的launchMode属性中配置

  • standard

    Activity 默认的启动模式。没当启动一个新的活动,它就会在(back stack)回退栈中入栈,并处于栈顶的位置,系统不会在乎这个 Activity 是否在栈中,每次启动都会创建该 Activity 的一个实例。

  • singleTop

    如果一个以singleTop模式启动的activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。

  • singleTask

    每次启动该 Activity 时系统首先会在返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例,并把在这个 Activity 之上的所有 Activity 统统出栈,如果没有发现就会创建一个新的活动实例。

  • singleInstance

    指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动,可以解决共享 Activity 实例的问题。

    以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

重要属性 taskAffinity

详解taskAffinity的博客

manifest文件中的一个重要属性,taskAffinity

  • taskAffinity表示当前activity具有亲和力的一个任务(task),这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务。
  • 具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务
  • 默认情况下,一个应用中的所有activity具有相同的taskAffinity,即应用程序的包名。我们可以通过设置不同的taskAffinity属性给应用中的activity分组,也可以把不同的 应用中的activity的taskAffinity设置成相同的值。
  • 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task
  • 这个属性决定两件事:当activity被re-parent时,它可以被re-paren哪个任务中;当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。

任务(Task)不仅可以跨应用(Application),还可以跨进程(Process)。

Intent FLAG

详解Intent FLAG的博客

  • FLAG_ACTIVITY_NEW_TASK

    设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity

  • FLAG_ACTIVITY_CLEAR_TOP

  • FLAG_ACTIVITY_BROUGHT_TO_FRONT
  • FLAG_ACTIVITY_MULTIPLE_TASK
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED