本篇内容主要从以下几个内容方面讲述Activtiy:
- Activity的生命周期
- Activity的启动模式
- Activity的跳转,关闭等。
- 面试中Activity的一些问题
面试中Activity的一些问题:
1.A->B->C 生命周期如何变化 结合启动模式。
2.数据保存,旋转什么的
3.Activity传值
一.Activity的生命周期
(1)onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……
(2)onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
(3)onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
(4)onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。
(5)onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
(6)onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。
(7)onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。
与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行? 通过阅读源码会发现,当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。
而onRestoreInstanceState是在onStart之后、onResume之前调用的。
二.Activity的四种状态
1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并,可与用户交互的激活装态;
2.Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,仍然可见,但是已经失去焦点,不可与用户交互。
3.Stopped状态:当Activity不可见时,Activity处于Stopped状态。比如从A Activity跳转到 B Activity后 A Activity就处于stop状态。
4.Killed状态:Activity被系统回收或者人为关闭后的状态,此时Activity已经关闭 以上四种状态,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。
三.Activity的启动模式
Standard
标准启动模式,Activity的默认启动模式。在这种模式下启动的Activity可以被多次实例化。在同一个Stack中可以存在多个Activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A, 即调用startActivity,会在A的上面再次启动一个A的实例,即当前的桟中的状态为A–>A。
SingleTop
如果一个以singleTop模式启动的Activity的实例已经存在于任务桟的桟顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中。举例来说,如果A的启动模式为singleTop,并且A的一个实例已经存在于栈顶中,那么再调用startActivity启动A时,不会再次创建A的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()方法。这时任务桟中还是这有一个A的实例。如果以singleTop模式启动的Activity的一个实例已经存在与任务桟中,但是不在桟顶,那么它的行为和standard模式相同,也会创建多个实例。
SingleTask
谷歌的官方文档上称,如果一个Activity的启动模式为singleTask,那么系统总会在一个新任务的最底部(root)启动这个Activity,并且被这个Activity启动的其他Activity会和该Activity同时存在于这个新任务中。如果系统中已经存在这样的一个Activity则会重用这个实例,并且调用他的onNewIntent()方法。即,这样的一个Activity在系统中只会存在一个实例。
但是这么描述并不准确,启动模式为singleTask的Activity并不会总是开启一个新的任务。设置了singleTask启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了singleTask启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。如果设置了singleTask启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。
SingleInstance
总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他Activity会自动运行于另一个任务中。当再次启动该Activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。