一直看到很多面试题中都有怎么加载Activity的问点,关于Activtiy的得后两种一直也是理解的不是很清楚,多写点总结下
Activity 中的加载模式是在laucher 中用android:launchMode属性来指定。
主要有以下四种加载模式:
1.standard :标准式,这个也是Activity 不定义时的加载模式。
2.SingleTop :Task 顶单例加载模式。
3.SingleTask :Task 内单例加载模式。
4.SingleInstance:全局单例加载模式。
以下来详细看看四种Activity的加载模式:
1. standard :标准式
这种Activity加载方式,每次启动目标Activity时,android 总会创建一个新的实例添加到当前Task 栈中。在一个按钮的事件中写如下:
Intent intent =new Intent (A.this,A.class);
StartAcitvity (intent); 发现没有都启动新的A的实例,单不同的A实例之间的hashcode不同,Task 栈的ID相同。
2. SingleTop :Task 顶单例加载模式。
这种Activity加载方式有分两种情况:
@1.启动的目标的Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是复用已有的Activity实 例 。
@2. 启动的目标的Activity 没有位于Task栈顶时,系统会重新创建目标Activity的实例,并将其加载到Task的栈顶----此时与standard 加载模式一样。
3. SingleTask :Task 内单例加载模式。这种加载模式的Activity 在同一个Task 内只有一个实例。
这种Activity加载方式有分三中种情况:
@1.如果启动的目标的Activity 不存在时,系统会重新创建目标Activity的实例,并将其加载到Task的栈顶。
@2.如果启动的目标的Activity 已经位于Task栈顶时,此时与SingleTop的加载方式相同。
@3.如果启动的目标的Activity A 已经存在,但没有位于Task栈顶时,此时系统会把位于该A Activity之上的所有Activity移出Task栈,从而使得目前Acitivity A 位于栈顶。
讲解@3. 如:A启动B ,栈中时从栈底往上 A--->B, B再启动A ,栈中时从栈底往上,A--->B-->A,如果启动B的加载模式SingleTask 类型,A再启动B时,栈中时从栈底往上,A--->B-->A-->B ,由于B是SingleTask 启动类型,所以会移出红色部分A--->B-->A-->B,使得B位于栈顶。
4.SingleInstance:全局单例加载模式。
这种Activity加载方式有两种情况:
这种Activity加载方式保证了无论从那个Task栈中启动目标Activity ,只会创建一个目标Activity实例,并且用一个全新的栈来装载该Activity 实例。
@1.如果启动的目标的Activity 不存在时,系统会先创建一个全新的Task,再创建目标Activity的实例,并将其加载到新的Task的栈顶。
@2.如果启动的目标的Activity 已经存在,无论位于那个应用程序,无论在那个栈中,系统会将该栈转到前台,从而使该Acitvity 显示出来。