Activity生命周期:
onCreate:在Acitivty第一次创建时调用,用于做初始化的工作
onStart:onCreate调用后调用,此次界面对用户来说无法看见
onResume:此次界面可见并显示到前台,且当前Acitvity位于当前栈顶,并且处于运行状态
onPause:表示当前Activity正在停止,常做一些存储数据、停止动画等工作(不做耗时操作)
onStop:表示当前Activity即将停止,一般做微量级的回收工作
onDestory:表示当前Activity即将被销毁,可做一些回收工作和最终的资源释放
onRestart:表示当前Activity正在重新启动,当前Activity从不可见状态变化为可见状态
Activity的构成
PhoneWindow是Window的实现类,而Window之下包含一个DecorView,DecorView实际是页面的顶级视图,开发是设置的布局资源添加到系统布局的mContentParent中,android解析XML方法(SAX、Pull、Dom三种方式)
Activity的四种启动模式(standard,singleTop,singleTask,singleInstance)
1:standard(标准启动模式)栈内允许有多个实例,互不影响
2:singleTop 当以singleTop为启动模式的Activity再次启动时,如果当前已经有一个实例位于栈顶,当再次调用原来的onNewIntent()函数,栈顶不会新加入一个实例。如果实例不在栈顶,则与standard标准启动一样
3:singleTask 如果一个Activity设置了该启动模式,任务栈中只能存在一个该Activity的实例。如果任务栈中存在一个Activity实例,则销毁当前Activity栈内位于实例之前的所有Activity实例,最终让该Activity实例位于栈顶。同时调用该Activity的onNewIntent()函数
4:singleInstance 设置singleInstance模式的Activity会在一个单独的任务栈中开启实例,当再次启动该Activity实例时,会重用已存在的任务与实例,并调用该实例的onNewIntent()函数,将intent实例中传递到该实例中
Note:(仍旧将任务栈中X前的实例全部取消)
对于singleTask作为启动模式的实例X,有选择其所需要的任务栈,例如本身主任务栈为S1,且当前任务栈中不存在X实例,若所需要的任务栈为S2,且任务栈S2不存在,则创建S2与X实例,并将实例X存入栈S2中
另一种情况下,假设X所需的任务栈为S1,其他情况如上述例子所示,由于S1任务栈已经存在,所以系统会直接创建X的实例并将其导入栈S1中
设置启动模式方法:
第一种:
1234 |
<activity android:name="com.sample.sampleActivity" android:launchMode="singleTask" android:label="@string/app_name"/> |
第二种:
1234 |
Intent intent=new Intent();intent.setClass(MainActivity.this,sampleActivity.class);intent.addFalgs(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent); |
Notes: 第一种无法直接为Activity设定FALG_ACTIVITY_CLEAR_TOP表示,而第二种方式无法为Activity指定singleInstance模式
Activity的Flags
- FALG_ACTIVITY_NEW_TASK(对应Activity的singletask启动模式)
- FALG_ACTIVITY_SINGLE_TOP (对应Activity的singletop启动模式)
- FALG_ACTIVITY_CLEAR_TOP(具有次标记的Activity,当他启动时,在同一任务栈中所有位于它上面的Activity都要出栈,一般与singleTask启动模式一起出现,如果启动的实例已经存在,系统就会调用onNewIntent)
- FALG_ACTIVITY_EXCLUDE_FROM_RESCENTS(具有这个标记的Activity不会出现在历史的Activity的列表中,等同与android:excludeFromRecents=”true”)
异常情况下的生命周期分析
1、情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
横竖屏突然转换,在默认情况下,Activity就会被销毁并且重新创建,系统先调用onSaveInstanceSate来保存当前Activity的状态。该方法调用在onStop之前,与onPause没有时序关系。当Activity在被重新创建之后,系统会调用onRestoreInstanceSate和onCreate方法来判断Activity是否被创建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceSate的调用在onStart上。类似TextView源码中包含onSaveInstanceSate方法保存控件内容。在AndroidManifest文件中设置android:configChanges=”orientation”保证屏幕方向固定,此时即使手机旋转界面仍旧保持原来方向不发生改变
2、情况2:Activity按照优先级从高到低,可以分为如下三种
(1) 前台Activity—正在和用户交互的Activity,优先级最高
(2) 可见但非前台Activity—比如Activity中弹出一个对话框,则背后的Activity就是属于这种情况,可见但位于后台无法与用户直接交互
(3) 后台Activity—已经被暂停的Activity,比如执行了onStop,优先级最低。
原文:大专栏 Android四大组件之Activity详解 · yclog
原文地址:https://www.cnblogs.com/wangziqiang123/p/11657848.html