Android里Activity和Activity的生命周期

来源:互联网 发布:上海海关学院 知乎 编辑:程序博客网 时间:2024/05/13 02:56

Activity是什么

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

创建Activity

创建一个Activity,需要创建一个扩展Activity基类的java类,如:

public class MyActivity extends Activity {        @Override        protected void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);                    setContentView(R.layout.activity_main);    }}

随后,在res/layout文件夹下定义activity_main .xml文件加载此Activity的用户界面。

还要,在清单文件AndroidManifest.xml中添加Activity信息。

常规下Activity的生命周期

正常情况下,Activity经历的生命周期和切换过程,如下图所示:


回调方法说明

         onCreate          表示Activity首次被创建时调用。在这个方法中,我们可以做一些初始化的工作,比如调用setContentView去加载界面布局资源、初始化Activity所需数据等。

         onStart              表示Activity正在被启动,已经可见时调用。但是还没有出现在前台,还无法和用户交互。这个时候可以理解为Activity已经显示出来了,但是我们还看不到。

         onResume        表示Activity出现在前台已经可见,并且可以跟用户交互时调用,要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。

         onPause            表示Activity正在暂停时调用,正常情况下,紧接着onStop就会被调用(在特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用)。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新Activity才会执行onCreate。

         onStop               表示Activity即将停止,不再对用户可见时调用,这时可以做一些稍微重量级的回收工作,同样不能太耗时。

         onDestory        表示Activity即将被系统销毁时调用,这是Activity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放。

         onRestart         表示Activity正在重新启动时调用。一般情况下,当前Activity从不可见重新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为所导致的,比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这时当前Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。

实况说明

1、  正常一个Activity,第一次启动时回调如下:onCreate-> onStart -> onResume。

2、  当用户打开新的Activity或者切换到桌面时,回调如下:onPasue –> onStop。(这里有一特殊情况:如果新的Activity采用了透明主题,那么当前Activity不会回调onStop。)

3、  当用户再次回到原Activity时,回调如下:onRestart-> onStart -> onResume。

4、  当用户按下back键回退时,回调如下:onPause-> onStop -> onDestroy。

5、  当Activity被系统回收后再次打开,生命周期方法回调过程和(1)一样,注意只是生命周期方法一样,不代表所有过程都一样。

6、 当从旧的Activity打开新的Activity时,两个Activity回调如下:旧onPasue-> 新onCreate -> 新onStart -> 新onResume-> 旧onStop。

注意

从整个生命周期来说,onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。

从Activity是否可见来说,onStart和onStop是配对的。随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

从Activity是否在前台来说,onResume和onPause是配对的,随着用户操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

特殊情况下Activity的生命周期

情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建

比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然也可以阻止系统重新创建Activity。在默认情况下,不做特殊处理,Activity就会被销毁并重新创建,其生命周期如图:


1、  系统配置发生改变后,Activity会被销毁,其onPasue、onStop、onDestroy均会被调用。

2、  Activity会被销毁时,系统会在调用onStop之前调用onSaveInstanceState来保存当前Activity的状态。(此状态和onPause是异步的,没有既定的时序关系,可能在之前也可能在之后被调用)

3、  Activity被重新创建后,系统会在调用onStart之后调用onRestoreInstanceState,并把销毁时用onSaveInstanceState所保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。(此状态和onResume是异步的,没有既定的时序关系,可能在之前也可能在之后被调用)

4、  onCreate正常启动的话,其参数Bundle savedInstanceState为null。

情况2:资源内存不足导致低优先级的Activity被杀死

         此情况跟情况1完全一致。当系统内存不足时,系统就会按照Activity优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。Activity按照优先级从高到低,可以分为如下三种:

         1、前台Activity                                  正在和用户交互的Activity,优先级最高。

         2、可见但非前台Activity                  比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互。

         3、后台Activity                                  已经被暂停的Activity,比如执行了onStop,优先级最低。

配置发生改变后,Activity不重新创建

为了避免系统配置发生改变后Activity重建,可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建来调用onCreate,就可以在AndroidManifest.xml中给configChanges属性添加orientation这个值,如下所示: android:configChanges="orientation"

         系统中所含项目非常多,下面介绍每个项目的含义,如表所示:                 

项目

含义

mcc

SIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460.此项标识mmc代码发生了改变

mnc

SIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,由两位数字组成,中国移动TD系统为00,中国联通为01,中国电信为03.此项标识mnc发生改变

locale

设备的本地位置发生了改变,一般指切换了系统语言(常用)

touchscreen

触摸屏发生了改变,这个很费解,正常情况下无法发生,可以忽略它

keyboard

键盘类型发生了改变,比如用户使用了外插键盘

keyboardHidden

键盘的可访问性发生了改变,比如用户调出了键盘(常用)

navigation

系统导航方式发生了改变,比如采用了轨迹球导航,这个有点费解,很难发生,可以忽略它

screenLayout

屏幕布局发生了改变,很可能是用户激活了另外一个显示设备

fontScale

系统字体缩放比例发生了改变,比如用户选择了一个新的字号

uiMode

用户界面模式发生了改变,比如用户开启夜间模式

orientation

屏幕方向发生了改变,这个是最常用的,比如旋转了手机屏幕(常用)

screenSize

当屏幕尺寸信息发生了改变,当旋转设备屏幕时,屏幕尺寸会发生变化,这个选项比较特殊,它和编译选项有关,当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API13新添加)

smallestScreenSize

设备的物理屏幕尺寸发生改变,这个项目和屏幕的方向没有关系,仅仅表示在实际物理屏幕的尺寸改变的时候发生,比如用户切换到了外部显示设备,这个选项和screenSize一样,当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API13新添加)

layoutDirection

当部局方向发生变化时,这个属性用的比较少,正常情况下无须修改部局的layoutDirection属性(API17新添加)

如果编译时指定的minSdkVersion和targetSdkVersion有一个大于13,为了防止旋转屏幕时Activity重启,所以除了orientation外,还应该加上screenSize,如:

 android:configChanges="orientation|screenSize"

这样做后,Activity没有重新创建,并且也没有调用onSaveInstanceStateonRestoreInstanceState来存储和恢复数据,取而代之的是系统调用了Activity的onConfigurationChanged方法。



——本博文部分内容参考自《Android开发艺术探索》

0 0
原创粉丝点击