Adnroid四大组件z之Activity的学习

来源:互联网 发布:淘宝66大促 编辑:程序博客网 时间:2024/05/22 06:05

Activity作为android中四大组件之一,承担着与用户直接交互的任务。学习activity自然要先理解其生命周期,才能熟练掌握。下贴一张官方的图,相信大家也看了无数遍了。


Activity的生命周期

activity在系统中被一个栈管理着,当一个新的activity开启时,会被放入栈顶同时开始运行。activity通常由4种基本状态(翻译自API文档):

        1)在前台屏幕运行(位于栈顶),处于活动的

        2)失去了焦点但是还是可见的,处于pause状态,当系统内存不足时会被Kill掉

        3)当被另外一个activity完全遮挡,出去Stop状态,但是依然保留着所有的状态与信息。但是也会被系统kill掉,当内存被需要时。

4)如果一个activity是paused或者stopped,系统可以将它清除内存,或者杀掉进程来结束。如果要再次将它展示给用户时,就必须完全restart同时提前存储状态

上述4点基本就是整个activity在程序中运行时的情况。

一个完成的生命周期(entire time)是第一次回调onCreate(Bundle)方法到单一的执行到onDestory();在onCreate里可以初始化全局的状态,同时在onDestory中释放掉资源,例如一个线程用来下载网络数据(耗时任务应该在工作线程中执行) 就可以在onCreate方法里创建,在onDestory里停止。

可见生命周期(visible lifetime),即onStart——onStop这个周期之间,在这段生命周期,activity一直能被用户在屏幕上看见。在onStart和onStop之间,你可以持有那些在activity中需要被展示给用户的资源,例如你可以在onStart里注册广播监控屏幕UI,当用户长时间没有看你展示的activity时,在onStop里注销广播。

前台生命周期(foreground lifetime)即回调onResume方法一直到调用onPause,这个周期内,activity位于所有其他activity之前,同时与用户进行交互。一个activity可以频繁的回到这两个方法,例如当屏幕息屏,当一个activity的结果分发过来了。所以google建议在这两个回调方法里的代码应该轻量级。

Activity的配置(Configuration)

根据API文档的说明,如果你不指定activity的config,当配置改变时(例如屏幕横竖切换,语言变换等)会造成当前activity被destoryed。可在manifest中使用android:configChanges来进行配置,具体参数见下表


具体各个字段的功能,笔者也没有逐个测试。通常在开发中会对横竖屏切换进行配置下,通常网上对android:configchangs的说明有以下几点,也是开发中经常用到的

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。

下面是笔者自己的测试的横竖屏切换结果:

1)什么都不指定的情况下:竖屏切横屏


横屏竖屏(并没有发现执行两次?此处存疑,希望有知道的朋友告之)


2)android:configchanges = oritation,横竖切换都会执行如下


3)android:configchanges = oritation|keyboardhidden|screenSize(本人测试minSdk=16,所以加上了screenSize),横竖切换都会执行如下


确实不会重新加载生命周期,只执行了onConfigurationChanged方法


Activity还有更多的知识点需要我来学习,在这里笔者将会在下一篇中带来Activity回退栈以和在Activity中临时保存数据进行学习。文中如有错误, 希望读者指出,大家共同进步,谢谢


1 0
原创粉丝点击