Android Activity的特殊情况总结

2019-05-24  本文已影响0人  一天一个脚印_修行

前言

    作为初级和中级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。


 .

上一篇下一篇

猜你喜欢

热点阅读