Android Activity生命周期和任务栈学习理解
学习Android我们打交道最多的就是Activity,它贯穿了我们整个Android的学习。由于Android的基础学习区别于java的基础学习,java的基础学习所有的类都是自己创建,对象都是自己调用。可以清晰的看见调用过程,而Android学习是基于Android源码开发的,相当于我们一开始就是用了一个巨大的,20多个G的框架进行学习,而它的许多对象创建、调用我们都是看不到的(看源码之前),所以学习activity的生命周期就很有必要了,它能告诉我们这个类的创建,使用,销毁的过程。
了解activity生命之前,我们应该先知道activity对象存放在哪?
因为我们的手机屏幕只有一个,所以在某一时刻只能显示运行一个Activity。那从一个activity调到另一个activity(界面跳转)的时候,前一个activity还在吗?当然是还在,用过手机的小伙伴想必都知道(废话),当你浏览网页不断跳转网页,在某个时候按返回键的时候,你可以不停的按back键,直到返回你刚进app时的那个界面,再按就退出app了。你会发现你按back键返回的界面和你跳转之前一毛一样(浏览过后字体的变化都还在),这就充分说明当一个activity跳转到另一个activity的时候原activity还在。既然还在那它保存在哪里呢?答案就是,我们所有的activity都被Android系统保存在一个专门的栈中----activity任务栈,学过java都知道栈的特性先进后出,后来者居上。这个任务栈就像一个盒子,盒子的顶部是我们的手机屏幕,所以只有位于栈顶的acivity才能被显示并运行。
![](https://i-blog.csdnimg.cn/blog_migrate/2e46e104858c181f6213651dec8be1ff.png)
如上图所示,现在位于栈顶的是Activity3所以现在手机屏幕上显示的是Activity3,Activity3就处于运行状态(Active)。而Activity1和Activity2就处于暂停,停止或者销毁状态。处于暂停和停止状态时Activity对象还存在,没有被回收,还可以通过OnRestart()和OnResume()重新唤醒它(当然要被唤醒的前提是它们要处于栈顶),也就是说要唤醒Activity2,Activity3要被弹出任务栈。当然得按顺序来。
在了解了Activity放哪之后,现在我们开始看Activity的生命周期:
![](https://i-blog.csdnimg.cn/blog_migrate/511d64b22d912af34355250ae9a979ad.png)
如图所示:设计Activity的生命周期的方法有7个:
(1) onCreate(): Activity第一次被创建时调用,一般在该方法中绑定或者设定布局,初始化控件View,绑定数据,设置监听器。
(2) onStart(): 调用这个方法时,Activity还没用被显示到屏幕上(也叫将要被用户可见),在这个方法里我们可以开启线程。
(3) onResume():调用这个方法时,Activity已经被显示到屏幕上了,可以进行一些交互操作,此时Activity处于任务栈的顶部。
(4) onPause() : 这个方法在当其他Activity启动后将要进入任务栈的时候调用,暂停Activity。在方法中可以停止线程,提交数据等。
(5) onStop():在调用onPause()后,其他Activity进入任务栈,并且可见后,对该Activity进行判定,如果现在位于栈顶的Activity完全遮挡住了本Activity,则调用此方法,如果未能完全遮挡,(比如Dialog模式的Activity),则不会调用本方法。而且该方法执行后,如果Android系统检测到内存不足时,此Activity会被杀死。
(6) onDestory():调用本方法后,Activity将会被销毁。
(7) onRestart() :当Activity被遮挡后(被挤到任务栈下面位置),在其他Activity里重新调用显示此Activity(此Activity已存在在任务栈,不是通过Oncreate()而来),最常见的就是按Back键返回此Activity。从图上可以看出来调用onRestart()后必定会调用onStart()。
另外插一句,我们跳转界面用的StartActivity(Intent)不是调用onStart()方法哦(默认情况下)!
后面Activity启动方式再接着学习!
-------------------------------------------------------------------------------- 这是本人学习随笔,水平有限,若有错漏欢迎指正。