Android Activity的特殊情况总结
前言
作为初级和中级Android开发工程师来讲, 在公司更多是在完善功能业务, 对四大组件更多也是停留在一些简单使用方面。四大组件作为Android基础,我也想好好探索以及深入了解一下Android的四大组件,巩固自己Android基础技术。
一、Activity
正常情况下的生命周期
(1). onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被调用。在特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用。笔者的理解是这种情况属于极端情况,用户操作很难重新这一场景。此时可以做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。
(2). onStop:表示Activity既将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
(3). onDestroy:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调了,在这里我们可以做一些回收工作和最终的资源释放。
异常情况下的生命周期
(1). 如果新Activity采用了透明主题,那么当前Activity不会回调onStop方法。
(2).当系统配置发生改变,Activity就会被销毁并重新创建,Activity在异常情况下终止时,系统会调用onSaveIntanceState来保存当前Activity的状态,这个方法在onStop之前调用,有可能在onPause方法前面或者后面调用。备注说明:onSaveIntanceState只会出现在Activity为异常终止的情况下,正常情况下系统不会调用这个方法(如:横竖屏转行),并且是Activity即将被销毁并且有机会重新显示的情况下才会去调用它。当Activity被重新创建后会调用onRestoreIntanceState恢复数据,在onStart方法之后调用,横竖屏(清单文件不做任何配置),测试结果只调用onRestoreIntanceState方法,onSaveIntanceState方法不调用。
正常横竖屏切换log(3). 不想系统重新创建Activity,可以给configChanges属性添加orientation这个值。同时如果targetSdkVersion大于13,还需要配置screenSize属性。如:android:configChanges="orientation|screenSize">。这个时候横竖屏切换的时候只会调用onConfigurationChanged方法。
Activity的启动模式的一些特殊情况
(1). singleTop:栈顶复用模式,如果Activity已经位于任务栈的栈顶,那么Activity不会被重新创建,会调用onNewIntent方法,然后onResume方法,onCreate和onStart方法不会被调用。应用场景:你的App运行后台,其他App启动你的App的当前Activity。
(2). singleTask:栈内复用模式,如果D所需的任务栈为S1,并且当前任务栈S1的情况为ADBC,根据栈内复用原理,D不会被重新创建,并且singleTask具有clearTop的功能,会导致栈内所有在D上面的Activity全部出栈,于是最终S1中的情况为AD。
(3). singleIntance:单实例模式,它是一种加强的singleTask模式,除了含有singleTask的属性之后,启动新的Activity会创建新的任务栈以及新Activity会独自在这个新的任务栈中。
(4). 什么是Activity所需的任务栈呢? 名字叫TaskAffinity,默认情况下,所有Activity所需的任务栈的名字为应用的包名。任务栈包括前台任务栈和后台任务栈。后台任务栈处于暂停状态,可以随时切换到前台任务栈。
(5). TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,其他情况没有意义。比如:两个不同应用,一个是前台任务栈AB,一个是后台任务栈CD,假设CD的启动模式为singleTask,现在启动D,整个后台任务栈都会被切换到前台任务栈,后台列表ABCD;TaskAffinity和allowTaskReparenting配合使用,比如现有两个应用A和B,A启动了B的一个ActivityC,然后按home键回到桌面,然后再点击B的桌面图标,这个时候并不是启动B的主界面,而是重新显示已经被应用A启动的ActivityC,或者说C从A的任务栈转移到B的任务栈中。
(6). 查看当前任务栈的命令行:adb shell dumpsys activity。
.