Activity生命周期
Activity 基本上以三种状态存在:
1.已继续:此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)
2.已暂停:另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 已暂停的 Activity 处于完全 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
3.已停止:该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。
Activity 生命周期中的三个嵌套循环:
1.Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。
2.Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
3.Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台—例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
Activity 生命周期:
Activity 生命周期回调方法汇总表:
当一个 Activity 启动另一个 Activity 时,它们都会体验到生命周期转变。第一个 Activity 暂停并停止(但如果它在后台仍然可见,则不会停止)时,系统会创建另一个 Activity。 如果这些 Activity 共用保存到磁盘或其他地方的数据,必须了解的是,在创建第二个 Activity 前,第一个 Activity 不会完全停止。更确切地说,启动第二个 Activity 的过程与停止第一个 Activity 的过程存在重叠。
生命周期回调的顺序经过明确定义,当两个 Activity 位于同一进程,并且由一个 Activity 启动另一个 Activity 时,其定义尤其明确。 以下是当 Activity A 启动 Activity B 时一系列操作的发生顺序:
1.Activity A 的 onPause() 方法执行。
2.Activity B 的 onCreate()、onStart() 和 onResume() 方法依次执行。(Activity B 现在具有用户焦点。)
3.然后,如果 Activity A 在屏幕上不再可见,则其 onStop() 方法执行。
您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。 例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause() 而不是 onStop() 执行期间向数据库写入数据。
Standard:Activity的默认加载方法,该方法会通过跳转到一个新的Activity,同时将实例压入到栈中(不管该activity是否已经存在在Task栈中,都是采用new操作,生命周期从onCreate()开始)。例如:栈中顺序是ABCD,此时D通过Intent跳转到A,那么栈中结构就变成ABCDA,点击返回按钮时,显示顺序是DCBA,一次销毁。
SingleTop:SingleTop模式下,当前D位于栈顶的时候,如果通过Intent跳转到它本身D,那么不会重新创建一个新的D实例(走onNewIntent()),所以栈中的结构依旧为ABCD,如果跳转到B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,结构就变成了ABCDB。应用实例:三条推送,点进去都是一个Activity。
SingleTask:SingleTask模式下,Task栈中只能有一个对应Activity的实例。例如现在栈结构为ABCD,此时D通过Intent跳转到B(走onNewIntent()),则栈结构变为AB,其中的CD被栈弹出销毁了,也就是说位于B之上的实例都被销毁了。应用实例:通常应用于首页,首页肯定得在栈底部,这只能在栈底部。
SingleInstance:SingleInstance模式下,会将打开的Activity压入一个新建的任务栈中。例如Task栈1中的结构为ABC,C通过Intent跳转到了D(D的模式为SingleInstance),那么则会新建一个Task栈2,栈1中结构依旧为ABC,栈2中结构为D,此时屏幕中显示D,之后D通过Intent跳转到D,栈2中不会压入新的D,所以2个栈中的情况没有发生改变。如果D跳转到了C,那么就会根据C对应的LaunchMode在栈1中进行对应的操作,C如果为Standard,那么D跳转到C,栈1的结构为ABCC,此时点击返回按钮,还是在C,栈1的结构变为ABC,而不会回到D。\
Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstance