读书前言
Android艺术探索是我找的一本Android进阶的书。学了2年多的Android,自以为Android基础不错,没想到简单阅览了这本书之后,发现自己真的是井底之蛙,用作者的话来说,只见树木,不知森林。所以,这本书值得我去整理,消化,并占为自用。OK,接下来是我自己对这本书的读书笔记,有什么总结错的地方,还请指出,谢谢!!
读书笔记
在了解Activity的生命周期之前,我要先说一下Activity“可见”和“前台”的两个状态。在区分onStart和onResume的时候,这个概念很重要,所以很有必要了解一下。简单的来说:
(1)前台Activity:正在与用户交互的Activity,优先级最高。
(2)可见非前台Activity:如被对话框挡住的Activity,这个是可见,但是不能与用户直接交互。
(3)不可见Activity:调用onStop的Activity,优先级最底。
Activity常用的生命周期有以下6个(作者写的是7个,还有一个onRestart,但是作者没怎么介绍这个):
onCreate
Activity在创建是调用,一般在这个方法初始化一些布局,如setContentView。
onStart
Activity在启动时调用,此时Activity处于可见,但非前台,还不能与用户交互。
onResume
此时的Activity已经处于可见,并可以与用户交互的状态。
onPause
此时的Activity还是处于可见,但是不能与用户交互,正常情况,接下来会调用onStop,但是,如果是启动的一个透明主题的Activity,onStop就不会被调用。可以在这个方法做一些数据销毁的事情,但是不能做稍微耗时的逻辑,因为会影响新的Activity的启动(下面再详细说)。
onStop
Activity处于停止状态,处于不可见,更不可交互。
onDestroy
Activity被销毁时调用。
我们从上面可以看出,生命周期方法总是成对出现的,onCreate和onDestroy,onStart和onStop,onResume和onPause。
作者问的第一个问题是,onStart和onStop与onResume和onPause的区别。我觉得在介绍生命周期已经很清楚了。
作者也为我们详细讲解了第二个问题:是新的Activity(A1)的onResume先调用还是当前的Activity(A2)的onPause先调用。
根据代码的解析,ActivityManagerService(维护ActivityStack,并负责Activity的状态)会先调用栈顶Activity(A2)的onPause方法,然后在去创建新的Activity(A1),调用新的Activity(A1)的生命周期,这就是为什么我们不能在onPause方法不能做稍微耗时的处理。最后看情况要不要调用A2的onStop(情况就是看A2是否被A1完全挡住)。代码这里就不贴出来了,有兴趣的看书。
作者考虑的还挺周到的,还和我们讲了Activity异常的生命周期。
(1)当系统配置发生变化时,如旋转手机屏幕。
当我们旋转手机屏幕的时候呢,系统会调用Activity的onPause,onStop,onDestroy,这是异常销毁,这是Activity会调用onSaveInstanceState方法保存数据,onSaveInstanceState方法可能在onStop之前,也可能在onStop之后,没有既定的时序,然后会重新创建原来Activity。新的Activity会调用onCreate,onStart,onResume。还会调用onRestoreInstanceState方法恢复数据,并将onSaveInstanceState时保存的Bundle传进来。onRestoreInstanceState方法一般在onStart之后被调用。我们也可以在onCreate恢复数据,发生异常之后,重新创建的Activity调用onCreate方法时,传进来的Bundle就是异常Activity在onSaveInstanceState保存的Bundle。官方是建议我们在onRestoreInstanceState恢复数据,大概是因为这个方法的参数一定不为空,而在onCreate方法的Bundle参数就不确定了,需要我们去判断。我之前都在是onCreate恢复数据的,因为大多数案例都是在onCreate恢复的。呵呵!!
这种情况,系统的view自己也会保存数据,如我们在EditText输入的内容,我们旋转后的activity也可以看到原来的内容。
原理很简单,就是发生这种情况时,onSaveInstanceState会保存数据,activity会委托window保存数据,window又会去委托顶级容器(ViewGroup)去保存数据,那么顶级容器(ViewGroup)会通知各个子view去保存数据。书中还介绍了TextView保存数据的源码,有兴趣看书。
这种情况是可以避免的,就是在manifest.xml声明activity的时候,我们添加一个configChange属性,然后在Activity中重写onConfigurationChanged方法。当系统配置发生了改变,只是执行Activity的onConfigurationChanged方法。这样就可以避免Activity异常销毁和重新创建。
书中说了3种常用的属性值:local(本地位置发生改变,如切换系统语言),orientation(屏幕方向发生改变,如旋转屏幕),keyboardHidden(键盘的可访问性发生改变,如用户调出键盘)。其他属性请详细看书。
(2)当系统急需内存的时
当系统急需内存时,Android会根据优先级杀死目标Activity的所在的进程。
我们扩展一下,其实Android系统分为5个等级的进程。
前台进程:等级最高,1;
可见进程:2;
服务进程:3;
后台进程:4;
空进程:等级最低,5;
具体这5个进程的详细介绍,请自行搜索。
这个时候,数据的保存与恢复同(1)。
以上是我从书中读到的“Activity的生命周期“ 的理解,感觉满满的收获!!