Activity的生命周期与加载模式(一)
Activity是android应用最重要的组成单元之一(另外三个是Service、BroadcaseReceiver、ContentProvider),Activity的功能是向用户呈现不同的操作界面。一个android应用通常有多个activity组成activity栈,当前活动的activity位于栈顶。
当Activity处于Android应用中运行时,同样受系统控制有其自身的生命周期。
下面详细介绍Android的生命周期:
***总结起来大致有4个状态***
- 活动状态:当前的Activity位于前台,可以看见,可以获得焦点。
- 暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
- 停止状态:该Activity不可见,失去焦点。
- 销毁状态:该Activity结束,或Activity所在的Dalvik进程被结束
图
在Activity的生命周期中有7个方法,3个阶段。
- onCreate() 该方法只会被调用一次
- onStart() 启动Activity时被回调
- onRestart() 重新启动Activity
- onResume() 恢复Activity,onStart()方法后一定会回调onResume()
- onPause() 暂停Activity
- onStop() 停止
- onDestroy() 销毁Activity,该方法只会被回调一次
3个状态为
开始Activity状态:onCreate()àonStart()àonResume()
重新获取焦点状态:onRestartàonStart()àonResume()
关闭Activity状态:onPause()àonStop()àonDestroy()
下面介绍Activity的4种加载模式
ü 在说加载模式之前先介绍一下Activity的配置
在应用中所有应用组件( Activity、Service、ContentProvider、BroadcaseReceiver)都必须进行显式配置。
配置Activity通常指定下面几个属性
- name : 该Activity实现类的类名
- icon : 指定图标
- label:指定标签
- exported:指定该activity是否允许被其他应用调用。
- launchMode:指定该activity的加载模式。
除此之外,一般还需要指定一个或多个<intent-filter…/>元素,用于响应该Activity可响应的Intent
下面说一下launchMode属性: 加载模式,该属性有4个属性值
- standard: 标准模式。默认模式
- singleTop: Task顶单例模式
- singleTask: Task内单例模式
- singleInstance: 全局单例模式
那么,Activity的加载模式到底是什么,干什么用的呢。在上面提过一下,Android中对Activity的管理是通过栈来管理的,也就是Task,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity,intent中配置为MAIN的。
1 <intent-filter>
2
3 <action android:name="android.intent.action.MAIN" />
4
5 <category android:name="android.intent.category.LAUNCHER" />
6
7 </intent-filter>
在android中并没为Task提供API,我们无法真正去访问Task,只能用getTaskId()方法来获取Activity所在Task的Id,然后,Task以栈的形式管理Activity,先启动的放在栈底,后启动的Activity放在栈顶。
那么,Activity的加载模式,就负责管理实例化、加载Activity的方法,并可以控制Activity与Task之间的加载关系。
下面详细介绍4种加载模式:
1、 standard模式
当用standard模式启动目标Activity时,每启动一次,android就会创建一个新的Activity实例,并将该Activity添加到当前Task栈中-----这种模式不会启动新的Task,新Activity将被添加到原有的Task中。
第3次启动
该Activity实例3 |
第2次启动
该Activity实例2 |
第1次启动
该Activity实例1 |
2、 singleTop模式
这种模式跟standard模式基本相似,只是有一点不同:当将要被启动的目标Activity已经位于栈顶时,系统将不会重新创建Activity实例,而是直接用已经位于栈顶的原有Activity实例。 如果目标Activity没有位于栈顶,此时系统会重新创建目标Activity的实例,并加载到Task的栈顶。
3、 singleTask模式
采用singleTask模式的Activity,在同一个Task中只能有一个该Activity实例,分为如下3中情况:
- 如果要启动的Activity实例不存在,则系统会创建该Activity实例,并加载到Task栈顶
- 如果要启动的Activity存在,且已经位于栈顶,则不需要实例化,此时与singleTop模式相同。
- 如果要启动的Activity存在,但,没有位于栈顶,此时系统将会把位于该Activity上面的所有其他Activity移除栈,从而使将要启动的Activity位于栈顶。
4、 singleInstance模式
这种模式又叫全局加载模式,意思是:无论将要加载的目标Activity位于哪个Task中,系统只会创建一个目标Activity实例,并且使用一个全新的Task栈来加载该Activity实例。
可以分为下面两种情况:
- 如果目标Activity不存在,系统会先创建一个全新的Task,然后实例化目标Activity,放入栈顶。
- 如果目标Activity已经存在,无论它在哪个应用程序(当然,那个应用程序的exported属性要设置为True,表面允许其他应用程序来启动该Activity),哪个Task栈中,系统都会把该Activity所在的Task转到前台,从而使用该Activity显示出来。
补充一点就是说,使用singleInstance加载模式时,系统创建一个全新的Task,然后Task栈中只包含该Activity。