Android四大组件之Activity
Activity作为Android中最基本的组件,提供界面供用户交互,类似于在Windows中的Window,每一个Activity都对应一个Window,且拥有自己的surface,用于在其上对不同的图层进行融合渲染。
作为开发者来说,Android Framework已经将关于Activity的核心逻辑封装完毕并提供了几个对外的接口,从而保证开发者可以对其不同的状态进行控制。下面的金字塔便是Android著名的生命周期。

onCreate(): 生命的起点,“入口”函数。一般来说用以指定UI界面,对类变量进行初始化。由于onRestoreInstance的调用时间不明确,因此也可以在onCreate中对onSaveInstance中保存的bundle数据进行恢复。
onStart(): 可见阶段,与onStop相反的工作。适合工作:由于调用onStart时,App有可能是经过很长时间后台后重新显示,因此比较适合检查某些系统资源是否准备妥当,比如网络连接是否OK,GPS是否可用等。
onResume(): 可见阶段。适合工作:恢复在onPause中暂停或释放的资源。比如动画,Camera, BroadCastReceiver的监听以及需要更新的Adapter。
onPause(): 界面处于半透明状态,不可与用户进行交互。适合工作:停止占用CPU(动画),保存一些不太耗时的资源(不做耽误时间的工作,比如保存数据库之类),释放部分系统资源(BroadCast Receiver, Camera, sensors及耗电的工作)。 总之,简单,迅速很重要。
onStop(): 完全不可见。适合工作:释放所有不会再被使用的资源(释放所有可能导致内存泄漏的引用),保存数据(可做比较耗时的操作,如保存,更新数据库)。
onDestory(): 不一定被调用,是释放资源的最后机会。
由于onPause(),OnStop(), onDestroy()三个阶段都可能会发生系统因内存不够强制结束当前程序的问题,所以保存某些必要资源是十分重要的(尤其是界面UI相关的,比如说Launcher中当前屏索引,游戏中得分和难度值等),因此系统提供了这两个回调函数用以处理意外情况发生时,资源保存的问题。
onSaveInstanceState(): 其参数表中的Bundle(key-value形式),专用以保存资源。但不能用以保存大型资源(Bitmap),不宜做耗时操作,保存的数据类型必须满足序列化的前提。
onRestoreInstanceState(): 恢复Bundle中保留的资源。此方法本人很少用到,因为onCreate中同样可以得到Bundle,且onRestoreInstanceState被调用的时机位于onStart之后,有可能会影响到UI的显示。
用户在使用Android手机时,有可能会更改某些设置对应用程序造成影响,比如:更改语言类型,横竖屏切换,SIM卡插拔,键盘弹隐等,这些操作会造成Activity的强制结束,为了方便开发者从容的应对因设置改变所带来的意外情况(此时所要保留的资源有可能比较大,不适合采用onSaveInstanceState),Android平台提供了两种方式来帮我们解决这样的问题。
第一种:
实现onRetainNonConfigurationInstance()接口,并在其中编写如下代码:
@Override public Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data; }
在onCreate中通过调用:getLastNonConfigurationInstance()来获得系统为我们保存的资源。(比如上次网络连接时已经下载好的资源)
需要注意的是,在onRetainNonConfigurationInstance中,不应该保存与Activity有关的资源,比如View, Drawable, Adapter等,由于当前Activity会被直接强制回收,但是因为其引用被资源所持有,导致无法Context被系统回收,引起内存泄漏。
第二种:
你并不希望Activity被重新启动,且希望能够由自己来处理当设置改变时的状态。那么首先在manifest中声明:
<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">
然后处理onConfigurationChanged()回调,并通过参数Configuration来判断是否是你所感兴趣的设置发生了变化,Configuration类提供了许多的常量来代表系统不同的设置。
引用:图片来源于Android Developers中Dev Guide。
关于Activity基本赘述完毕,以后如有补充再来继续。
浙公网安备 33010602011771号