Android的生命周期和启动模式
来源:互联网 发布:深入理解java泛型 编辑:程序博客网 时间:2024/06/06 05:08
Activity的生命周期和启动模式
大概分为如下模块进行分析:
- 典型情况下的生命周期分析
- 异常情况下的生命周期分析
- Activity的LaunchMode
- Activity的Flags
- IntentFilter的匹配规则
生命周期
(1)正常情况下的生命周期
①onCreate();表示Activity正在被创建,一般在这个方法里执行一些初始化工作,比如setContentView()加载界面布局资源.
②onRestart();表示Activity正在重新启动,一般是当当前Activity从不可见重新变为可见的时候调用。比如用户按下Home键或者打开一个新的Activity后接着又回到Activity。
③onStart(); 表示Activity正在启动,这时Activity可见了,只是还在后台没有到前台,还不可以与用户进行交互。可以理解成显示出来了,但是还看不到。
④onResume(); Activity可见,也显示在前台了,可以与用户进行交互了。与onStart的区别可以理解为onStart时还在后台,onResume显示在前台。
⑤onPause();表示正在停止,紧接着会调用onStop()方法。如果新的Activity为透明,可以执行停止动画、存储数据操作,不能执行耗时的操作。因为启动新的Activity,必须调用完前一个onPause方法才能调用新的Activity的onCreate方法。
⑥onStop();表示即将停止,可以进行稍微重量级的回收工作,同样不能执行太过耗时的操作。
⑦onDestroy();表示Activity即将销毁。可以进行最后的回收工作和资源的释放。
流程图:
注意:
(1)当用户切换至Home或者打开新的Activity的时候,调用onPause->onStop,有一种特殊情况:当新的Activity为透明的主题时,只会调用onPause方法,不会调用onStop方法。
(2)当返回至原Activity时,回调顺序如下:onRestart->onStart->onResume;
(3)当用户按下back回退键的时候,onPause->onStop->onDestroy;
(2)异常情况下的生命周期
- Activity除了用户操作导致的生命周期调度外,还有一些异常情况,比如资源系统配置改变或者当内存不足时,Activity可能被杀死。
①资源相关的系统配置发生改变导致Activity被杀死及重新创建
- 当屏幕为竖屏的时候突然转为横屏,这时候系统配置发生改变,Activity会回调onPause->onStop->onDestroy方法,然后重新创建Activity。同时,由于异常情况发生,系统会调用onSaveInstanceState方法保存当前Activity的状态。注意,只有当发生异常情况系统才会调用这个方法,否则不会调用。当Activity重新创建时,系统会调用onRestoreInstanceState方法,并且把onSaveInstanceState方法所保存的bundle对象作为参数传给onRestoreInstanceState方法和onCreate方法。
②当内存不足时低优先级的Activity被杀死
这种情况的数据存储和恢复和①完全一致。优先级从高->低:
1.前台Activity – 正在与用户进行交互的界面。
2.可见但非前台的activity – 比如Activity弹出了一个对话框,activity可见但是位于后台不能与用户进行交互。
3.已经暂停的Activity – 执行了onstop方法的优先级最低。
当系统内存不足时就会按照如上优先级的高低进行杀死Activity,并在后续会调用onSaveInstanceState和onRestoreInstanceState进行数据的保存和恢复。当系统配置改变后,可不可以不要重新创建Activity呢?答案是可以的。设置configChanges属性,比如orientation(当屏幕旋转时,不重新创建),还有两个比较常见的locale和keyboardHidden。locale:一般指换了系统语言;keyboardhidden:键盘的可访问性发生了变化,比如用户调出键盘。不重新创建的时候调用的onConfigurationChanges方法。
启动模式
(1)Activity的launchMode
为什么需要启动模式?在我们多次启动同一个activity的时候,系统会创建多个实例并一一放入任务栈中,当我们按back键时,会发现这些Activity会一一地回退。而任务栈是“后进先出”的栈结构,没按下一次back键就会有一个Activity出栈直到栈为空,当栈中没有任何Activity时系统会回收这个任务栈。问题来了:多次启动同一个Activity,系统重复创建多个实例。所以为了解决这个问题,Android提供了四中启动模式修改系统的默认行为。目前分别有四种启动模式:standard,singleTop,singleTask和singleInstance.
<2>singleTop:栈顶复用模式。如果新Activity已经位于任务栈的栈顶,则此Activity不会被创建,同事它的onNewIntent方法会被回调。注意这个Activity的onCreate,onStart不会被调用,因为它并没有发生改变。如果新的Activity不在栈顶,那么新的Activity仍然会重新创建。
<3>singleTask:栈内复用模式。这是一种单实例模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调它的onNewIntent方法。
<4>singleInstance:单实例模式。是加强版的SingleTask模式,他除了具有SingleTask模式的所有特性外,还加强了,那就是具有此种模式的Activity只能单独地位于一个任务栈中,不再区分任务栈。
给Activity指定启动模式有两种方法,第一种是通过Androidmenifest为Activity指定启动模式。
<activity android:name="...." android:configChanges="orientation" android:launchMode= "singleTask" android:label = "..."</activity>
- 第二种方式是通过在Intent中设置标志位来为Activity指定启动模式,比如:
Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
- 以上两者有区别。首先,优先级上,第二种方式的优先级要高于第一种,当两种方式存在时以第二种为准;其次,在限定范围上有所不同,比如第一种方式无法直接Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法为Activity指定singleInstance模式。
Activity的Flags
- <1>FLAG_ACTIVITY_NEW_TASK
这个标记为的作用是为Activity指定”singleTask”启动模式,其效果和在xml钟指定改启动模式相同。 - <2>FLAG_ACTIVITY_SINGLE_TOP
这个标记为的作用是为Activity指定”singleTop”启动模式,其效果和在xml钟指定改启动模式相同。 - <3>FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的Activity,当它启动时,在同一个任务栈所有位于他上面的Activity都要出栈。这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。
- Android 的生命周期和启动模式
- Android的生命周期和启动模式
- Android的生命周期和启动模式
- Android的生命周期和启动模式
- Android学习笔记之Activity的生命周期和启动模式
- Android的生命周期和启动模式以及使用场景
- Android开发艺术-第一章Activity的生命周期和启动模式
- Android的activity启动模式,和生命周期,及onkeydown方法
- Activity的启动模式和生命周期 android初学者必看;
- 七.Android的Activity生命周期和启动模式
- android里activity的生命周期和启动模式
- Android拾萃- Activity的生命周期和启动模式
- android 学习activity生命周期和启动模式
- android Activity生命周期和启动模式详解
- Android Activity生命周期和启动模式
- Android-Activity的生命周期与启动模式
- Android不同启动模式下的生命周期
- Android Activity的生命周期及启动模式
- POJ 1741 Tree 点分治
- OpenGL 绘制国民党党徽 共青团团徽 花型(可变边的数目)
- Axure 8.0 注册码
- 批量处理 删除指定目录与子目录下的.svn文件夹
- java的个人学习经验!
- Android的生命周期和启动模式
- 【deeplearning.ai笔记第二课】1.2 欠拟合和过拟合(bias variance)
- 第七周 项目2
- 第七周【项目2
- sqlserver触发器根据COLUMNS_UPDATED内容生成动态更新列
- 在Swift 中 “方法访问”
- vijos(又一道并查集,我并查集可算是再也不用做什么题了)
- [转载]自己亲身经历,房屋买卖二手房,和中介打官司,唉,烦心!
- 利用Construct2制作第一个游戏