一、四大组件之一的Activity组件,在应用中一个activity可用来表示一个界面,中文意思为“活动”,即一个活动 开始,代表activity组件启动,活动结束,activity的生命周期结束。一个android应用鼻血通过activity来启动和运行。activity的生命周期交给系统统一管理。
二、在android中activity拥有三个基本状态
1、resumed:一个新的activity启动入栈后,它在屏幕最前端,此时它处于可见并可和用户交互的状态。
2、paused:当一个activity被另一一个透明或者dialog状态的activity覆盖时的状态。此时它依旧与窗口管理器保持连接,系统继续维护它的状态,所以它仍然可见,但已经失去了焦点,所以不能与用户交互。
3、stopped:当一个activity被另一个activity覆盖、失去焦点并不可见时的状态。
三、activity生命周期
下面是API中给出的activity的生命周期图
图一
activity包含七个生命周期的方法:
(1)onCreate():创建时被调用
(2)onStart():可见时被调用
(3)onRestart():重新可见时被调用,接着会调用onStart()
(4)onResumed():activity获得焦点,可进行输入时被调用
(5)onPaused():失去焦点但可见时被调用(在其他应用需要内存时,可能会被kills)
(6)onStopped():完全不可见时被调用,会被系统kills
(7)onDestroyed():被销毁时被调用,会被系统kills
整个过程如下图所示:
图二
Google官方培训文档中对activity的生命周期进行了详细的讲解(以下为引用):
1、启动与销毁activity
在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调函数。Activity生命周期的每一个阶段就像金字塔中的台阶。当系统创建了一个新的activity实例,每一个回调函数会向上移动activity状态。处在金字塔顶端意味着当前activity处在前台并处于用户可与其进行交互的状态。
当用户退出这个activity时,为了回收该activity,系统会调用其它方法来向下移动activity状态。在某些情况下,activity会隐藏在金字塔下等待(例如当用户切换到其他app),此时activity可以重新回到顶端(如果用户回到这个activity)并恢复用户离开时的状态。(如图一所示)
根据activity的复杂度,也许不需要实现所有的生命周期方法。但了解每一个方法的回调时机并在其中填充相应功能,使得确保app能够像用户期望的那样执行是很有必要的。如何实现一个符合用户期待的app,我们需要注意下面几点:
- 使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。
- 用户没有激活某个组件时不会消耗宝贵的系统资源。
- 离开app并且一段时间后返回,不会丢失用户的使用进度。
- 设备发生屏幕旋转时不会crash或者丢失用户的使用进度。
然而,其中只有三个状态是静态的,这三个状态下activity可以存在一段比较长的时间。(其它几个状态会很快就切换掉,停留的时间比较短暂)
- Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为"running" 状态)
- Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
- Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。
其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。以上就是基本的activity生命周期。
指定程序首次启动的Activity
当用户从主界面点击程序图标时,系统会调用app中被声明为Mainactivity中的onCreate()方法。这个Activity被用来当作程序的主要进入点。
我们可以在AndroidManifest.xml中定义作为主activity的activity。
这个mainactivity必须在manifest使用包括 MAIN action与 LAUNCHER category的<intent-filter>标签来声明。例如:
<activityandroid:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name=