1 . 概述
Android的管理主要是通过Activity栈来进行的。当一个Activity启动时,系统根据其配置或调用的方式,将Activity压入一个特定的栈中,系统处于运行(Running or Resumed)状态。当按Back键或触发finish()方法时,Activity会从栈中被压出,进而被销毁,当有新的Activity压入栈时,如果原Activity仍然可见,则原Activity的状态将转变为暂停(Paused)状态,如果原Activity完全被遮挡,那么其状态将转变为停止(Stopped)。
2 .启动模式的作用
Activity启动模式就是属于Activity配置属性之一,叫它具有四种启动模式,分别是:1.standard ,2.singleTop,3.singleTask,4.singleInstance,一般如果不显示声明,默认为standard模式。launchMode 在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他 Activity实例公用一个task里。
3 . 模式的说明
(1)standard模式:每次**Activity时(startActivity),都创建Activity实例,并放入任务栈
看代码:
<activity
android:name=".test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".test.SecondActivity"/>
<activity
android:name=".test.ThirdActivity"/>
三个Activity都设有一个跳转按钮
MainActivity:
Intent intent = newIntent();
intent.setClass( MainActivity.this ,SecondActivity.class);
startActivity( intent );
SecondActivity :
but.setOnClickListener(newView.OnClickListener(){
@Override
public voidonClick(Viewv) {
Intent intent =newIntent();
intent.setClass( SecondActivity.this ,ThirdActivity.class);
startActivity( intent );
}
});
ThirdActivity:
but.setOnClickListener(newView.OnClickListener(){
@Override
public voidonClick(Viewv) {
Intent intent =newIntent();
intent.setClass( ThirdActivity.this ,MainActivity.class);
startActivity( intent );
}
});
操作步骤:点击第一个界面的button跳转到第二个,在第二个点击button跳转到第三个界面,点击第三个界面button跳转到第一个界面。
看结果:
在上面的基础上当按下Back键后,结果为:
总结:standard模式,这是系统默认的启动模式,这种模式就是创建一个Activity压入Task容器栈中,当当前Activity**,并处在和用户交互时,此Activity弹出栈顶,当finish()的时候,在任务栈中销毁该实例。
(2)singleTop:如果某个Activity自己**自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
看代码:
<activity
android:launchMode="singleTop"
android:name=".test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:launchMode="singleTop"
android:name=".test.SecondActivity"/>
<activity
android:name=".test.ThirdActivity"/>
操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button
SecondActivity界面的调转给为下:
but.setOnClickListener(newView.OnClickListener(){
@Override
public voidonClick(Viewv) {
Intent intent =newIntent();
intent.setClass( SecondActivity.this ,SecondActivity.class);//自己调到自己
startActivity( intent );
}
});
看结果:
不自己跳到自己时:
操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳大第三个界面,点击第三个界面button调到第一个界面
but.setOnClickListener(newView.OnClickListener(){
@Override
public voidonClick(Viewv) {
Intent intent =newIntent();
intent.setClass( SecondActivity.this ,ThirdActivity.class);
startActivity( intent );
}
});
看结果:
总结:singleTop模式:这种模式首先会判断要**的Activity是否在栈顶,如果在则不重新创建新的实例,复用当前的实例,如果不在栈顶,则在任务栈中创建实例。条件是是否在栈顶,而不是是否在栈中。
(3)singleTask:如果要**的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
看代码:
<activity
android:launchMode="singleTask"
android:name=".test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".test.SecondActivity"/>
<activity
android:name=".test.ThirdActivity"/>
操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳大第三个界面,点击第三个界面button调到第一个界面
当界面调到第三个界面时的结果为:
在上面的基础上点击第三个界面button是结果为:
总结:singleTask模式,这种模式启 动的目标Activity实例如果已经存在task容器栈中,不管当前实例处于栈的任何位置,是栈顶也好,栈底也好,还是处于栈中间,只要目标 Activity实例处于task容器栈中,都可以重用该Activity实例对象,然后,把处于该Activity实例对象上面全部Activity实 例清除掉,并且,task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。所以,如果你想你的应用不管怎么启动目标Activity,都只有 唯一一个实例对象,就使用这种启动模式。
(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要**MainActivity,则不需要创建,两应用共享该Activity实例;
看代码:
<activity
android:name=".test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".test.SecondActivity"/>
<activity
android:launchMode="singleInstance"
android:name=".test.ThirdActivity"/>
操作步骤:点击第一个界面button跳转到第二界面,点击第二个界面button跳到第三个界面
看结果:
ThirdActivity单独在一个栈中。
总结:singleInstance模式,当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要**的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
总之,Android四大启动模式相当简单。默认standard模式,他是task容器栈可能存在相同的Activity实例;singletop模式 下,重用栈顶Activity实例,栈顶不存在,则创建新的Activity实例,该模式下有可能存在相同Activity实例;singletask模 式,task容器栈存在目标Activity实例,则重用该实例,task容器栈永远只有唯一activity实例,并且,其一是Activity实例被 清除掉。singleinstance模式,不同应用可以共享Activity实例,并且是处于不同容器栈中。