认识Activity
2020-03-09 本文已影响0人
编程的猫
Activity是Android的四大组件之一,用来呈现视图的窗口
-
生命周期
生命周期依次是:
onCreate,onStart,onResume,onPause,onStop,onDestroy。从创建到销毁,前后方法一一对应其中onResume可见并获取窗口的焦点,onPause可见失去焦点(不可出发Activity),其余方法都不可见。
-
保存activity的状态:onSaveInstanceState()
Activity的 onSaveInstanceState() 和onRestoreInstanceState()并不是生命周期方法,它们不同于onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。 -
横竖屏切换生命周期的执行情况
当在manifest.xml的activity中没有配置configChanged时,切换屏幕会先销毁当前activity,然后重新加载activity;当在manifest.xml中配置configChanded=“orientation”时,不会调用activity各生命周期方法,会执行onConfigrationChanged方法
-
actiity A跳转activity B生命周期方法的执行是什么样的?
首先会执行A的onPause,接着执行B的onCreate,onStart,onResume,此时B已经覆盖A,A会执行onStop方法
-
Task栈
- Task栈是存储Activity的一种数据结构,原则是先进后出。
- 在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity。
- 同一个Task Stack,只要不在栈顶,就是onStop状态
- 任务栈的id自增长型,是Integer类型
- 新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)。
- 当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程(狂点Back退出到Home界面后点击Menu会发现还有这个App的框框。个人理解应该是这个意思),再次点击进入应用会创建新的Task栈
-
Activity的affinity
- affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中。
- Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定。
- 在默认情况下(我们什么都不设置),所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性。
- Application默认的affinity属性为Manifest的包名。
-
Activity的启动模式
- standard
该模式可以被设定,Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中: - singleTop
如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity,否则创建新的activity应用场景:开启渠道多,适合多应用开启调用的Activity:通过这种设置可以避免已经创建过的Activity被重复创建(多数通过动态设置使用,关于动态设置下面会详细介绍)
- singleTask
如果Task栈中又目标activity,则会将该activity之上的所有activity全部移除,自身将会置于栈顶获取焦点。如果没有则创建新的activity应用场景:程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。
- singleInstance:
在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)
- standard
XML中设置启动模式都是静态设置,也可以通过动态代码设置。
参考博文(https://blog.csdn.net/zy_jibai/article/details/80587083
)
-
onNewInstance
- activity 启动模式设置成:singleTask、singleInstance
Activity A-->Activity B,Activity B-->Activity A;
在B跳转到A的时候,A会执行onNewInstance(),onRestart(),onStart(),onResume() - activity 启动模式设置成:singleTask、singleInstance,singleTop
Activity A-->Activity A
A会执行:onPause(),onNewInstance(),onResume();
- activity 启动模式设置成:singleTask、singleInstance
前提:ActivityA已经启动过,处于当前应用的Activity堆栈中;
当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法
当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法
当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法