什么是Activity?
Android四大组件之首 ,中文直译“活动”,主要是用来显示视图的。就是因为它非常的重要,所以不得不先写它
Activity必须知道的知识点:
1.Activity生命周期:
什么是Activity的生命周期:说句大白话就是Activity从生到死(也就是打开一个视图到最后视图彻底销毁)
具体生命周期分析:
onCreate:表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中,我们可以做一些初始化操作,比如可以使用setContentView()去加载视图,也可以初始化所需要的数据。
onRestart:表示Activity正在重新启动。一般情况下,当目前的Activity从不可见到可见状态时,会调用这个方法,这种情况一般为用户所造成的,比如按下Home键切到桌面然后再切到这个Activity时 会调用这个方法。
onStart:表示Activity正在被启动,即将开始,这时Activity已经属于可见状态了,但是还没有出现在前台,还无法与用户交互,可以理解为Activity已经显示出来了 但是我们还是看不见。
onResume:表示Activity已经可见了,并且出现在前台开始活动。
onPause:表示Activity正在停止,正常情况下紧接着onStop就会被调用。在特殊情况下,如果这个时候快速回到当前的Activity那么onResume会被调用。这种情况非常极端,用户很难重现这种情况。
onStop:表示Activity即将停止,可以做一些重量级的回收工作,不能太耗时。
onDestory:表示Activity即将被销毁,这是Activity生命周期的最后一个方法,在这个方法中我们可以做最终的回收工作,最终的资源释放。
生命周期图:
![](https://img.haomeiwen.com/i10436964/44bb6187c2a6bd3c.jpg)
常见的几种情况:
1.针对一个特定的Activity,第一次启动,回调方法:onCreact->onStart->onResume
2.当用户打开新的Activity或者切换到桌面的时候,回调方法:onPause->onStop。这里有一种特殊情况如果新的Activity采用了透明主题,那么当前的Activity不会回调onStop。
3.当用户再次到原Activity时,回调方法:onRestart->onStart->onResume。
4.当用户按back键回退时,回调方法:onPause->onStop->onDestory.
5.当Activity被系统回收再次打开,生命周期回调和1一样
6.从整个生命周期来讲onCreate和onDestory是配对的,它们分别标志Activity的创建和销毁,并且只可能有一次调用。从Activity是否可见来讲,onStop和onStart是配对的,随着用户的操作屏幕的点亮和熄灭onResume和onPause是配对的
下面我们再讲一下异常情况下的生命周期
情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
如何理解这个问题呢?首先我们要对资源加载机制了解,比如一张图片放在不同的资源目录下会加载不同的效果,比如横竖屏切换的时候,竖屏变为横屏的时候会把当前的Activity销毁 然后再创建 ,具体生命周期如图:
![](https://img.haomeiwen.com/i10436964/9ad1ce062e0638bc.png)
情况2:资源不足导致低优先级的Activity被杀死
首先描述一下优先级 从高到低分为三种:
1.前台Activity——正在和用户交互的Activity,优先级最高。
2.可见但并不是前台Activity——例如弹出一个对话框,导致Activity可见但处在后台与用户无法直接交互。
3.后台的Activity——已经被暂停的Activity,比如执行了onStop,优先级最低
当系统内存不足的时候,系统会自动按上面的优先级顺序来杀死Activity所处的进程,并在onSaveInstanceState和onRestoreInstanceState来储存和恢复数据。如果一个进程没有四大组件在执行,那么它会很快被进程杀死,最好的方式就是依托四大组件。
下面讲一下Activity的LaunchMode(启动模式)
为什么需要启动模式?
当我们多次启动同一个Activity时,系统会创建多个实例并把它一一放入任务栈中 当我们点击返回键时这些Activity会一一回退,任务栈是一种“后进先出”的栈结构。
四大启动模式:
1.standard:标准模式,这也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。 被创建的实例的生命周期符合典型情况下Activity的生命周期,就如上面描述,onCreate,onStart,onResume都会被调用。这是一个典型的多实例实现,一个任务栈可以有多个实例每个实例也可以属于不同的任务栈,在这种模式中谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
2.singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。需要注意的是,这个Activity的onCreate,onStart不会被系统调用因为它并没有发生改变。如果新Activity的实例已存在但不是位于栈顶,那么新Activity还是会被重新创建。
3.singleTask:栈内复用模式。这是一种单例模式,在这种模式下,在这种模式下只要Activity在一个栈中,那么就不会重新创建实例。这和singleTop一样,系统也会回调其onNewIntent。
4.singleInstance:单实例模式。这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外还加强了一点,那就是Activity只能单独位于一个栈,后续创建新的Activity会创建新的任务栈,除非特殊情况会销毁;
Activity的Flags
Activity的Flags有很多 ,我在这里分析的是一些常用的标记位
FLAG_ACTIVITY_NEW_TASK
这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定效果一样
FLAG_ACTIVITY_SINGLE_TOP
这个标记位的作用是为“single”启动模式,其效果和在XML中指定效果一样
FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的Activity,当它启动的时候在同一任务栈中所有位于它上面的Activity都要出栈。这个标记一般和singleTask启动模式一起出现
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记的Activity不会被Activity历史列表所记住,相当于XML种Activity的属性android:excludeFromRecents="true"。
网友评论