Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content PRovider内容提供者,BroadcastReceiver广播接收器)之一。
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
创建一个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没有重新创建,并且也没有调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,取而代之的是系统调用了Activity的onConfigurationChanged方法。
新闻热点
疑难解答