是什么?
acntivity是一组包含用户界面的组件,主要用于和用户进行交互的。也就是用户看得到的东西就是activity。
Activity是怎么回退的:
android是使用任务task去管理activity的,
Android中的activity是层叠显示的,每启动一个activity,新的activity就会覆盖在旧的上面,如果按下返回按钮,就会销毁最上层的,这是在这层下面的就会显示出来。。
Activity的4种状态:
运行状态:
这时activity在栈顶,对用户是可见的,系统无论如何,也不会去回收一个正在运行的activity。
暂停状态:
Ativity不在栈顶了,仍然可见的时候,这个时候处于暂停状态,比如弹出一个dialog的时候,这个时候栈顶的activity就是暂停状态,但是对用户还是可见的,系统会在内存极低的时候,回收掉这个activity。
停止状态:
Ativity不在栈顶了,并且完全不可见的时候,就进入了停止状态,系统会对这类活动进行短暂的保活,并不是完全可靠的,如果其他地方需要内存的时候,处于停住状态就会被回收。
销毁状态:
当从返回栈中移除后,就变成了销毁状态,系统最喜欢回收这种东西了。
Activity的生命周期。
OnCreate()
第一次创建的时候调用。一般用来做一些出数据的操作。比如,加载布局,初始化事件。。
OnStart()
在不可见准备变为可见的时候调用。
OnResume()
可见,并且有焦点交互的时候,这个时候,这个activity一定在返回栈的栈顶。并且处于运行状态。
OnPause()
系统准备去启动||恢复另外一个activity的时候调用,
OnStop()
在activity完全不可见的时候调用,
一般在这里都会把一些在当前这个activity的耗损资源的一些操作释放了,和保存一些关键的数据。这个方法一定要快,不能超过10秒,否者系统就会报ARN了。
和上面的区别在,如果打开新的活动是一个dialog,那么OnPause会执行,onStop不会执行。
OnDestroy()finish的时候调用
销毁之前调用,之后这个activity的状态就是销毁状态了。
OnRestart()
由停止状态变为运行状态之前调用,就是重启的时候调用,
OnSaveInstanceState()
只有在activity即将销毁的时候,并且有机会重新显示的时候才会调用,正常生命周期不会调用。
生命周期的3种场景划分
完整生命周期:
从onCreate--->OnDestroy。。一般情况下,onCreate方法中完成初始化操作,onDestroy完成释放的操作。
可见周期:
OnStart-->OnStop(),这段周期内,对用户是可见的,并不一定需要和用户交互,
前台周期:
OnCreate-->OnResume(),这段周期,是可以和用户交互的周期,activity经常会在onPause和OnResume中交互很频发,列如,切换到后台,切回来,锁屏,来电话了,被遮挡了,多app切换来回,等等,所以一般建议这两个方法应当非常简洁,不应该有耗时操作。。
异常生命周期:
OnPause-->onSaveInstanceState(bundle)--->OnStop->onDestory-->onCreate(bundle)---OnResume()
但是在onStop被调用之前系统会调用onSaveInstanceState(bundle)保存数据,这个方法只会在activity异常终止情况下才会调用,
,如果出现异常周期,那onCreate的bundle一定不会是空的。
情况1.资源相关的系统配置发生改变导致Activity被杀死并重新创建(如横竖屏切换)
这种情况,可以通过配置configChanges来解决,
情况2:资源内存不足导致低优先级的Activity被杀死
无法避免,做好数据恢复。
回收场景优先级:
1.Android不会回收正在处于可见状态的的activity。
2.内存不够的时候,会回收不可见的Activity。如果被回收了,这个activitu会自动调用OnSaveInstanceState,这个办法,用来保存数据的,
前台<---可见但非前台(dialog)<---后台(被暂停的Activity)
4种启动模式:
可以通过设置activity的launchMode来指定启动模式。
Standard:默认的模式
不值得的情况下,默认就是这种。
每开启一个新的activity,系统就会创建一个新的活动,插入栈顶,并且显示,后进先出,不管栈里有没有。
SingleTop:栈顶复用模式
如果发现栈顶已经存在,就不会再创建了。
如果不在栈顶,那还是会重复创建。
SingleTask:栈内复用模式
如果栈有,直接使用,不会创建,并且在该栈上面的activity全部出栈,
SingleInstance:单一实例模式
他会运行在自己单独,独立的任务栈里面,