Android activity的启动模式
自己的理解加上网上的一些资料总结了关于activity的四种启动模式
在实际项目中我们应该依据特定的需求 为每一个活动指定恰当的启动模式。
启动模式一共同拥有四种,各自是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 过给<activity>标签 指定 android:launchMode属性来选择启动模式。
1,standard(这是活动的一个标准模式,在创建活动的时候默认是这个模式)
在 standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建 该活动的一个新的实例。
接下来通过一段代码来了解一下。
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", this.toString());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
} });
}
我个人觉得代码跟截图应该挺清晰的说明了问题所在,所以我就不再说明了。
2,singleTop
使用singleTop模式。当活动的启动模式指定为 singleTop,在启动活动时假设发现返回栈的栈顶已经是该活动。则觉得能够直接使用它。不会再创建新的活动实例。
如今在AndroidManifest.xml中改动Activity的启动模式(android:launchMode="singleTop")
然后又一次执行程序,查看 LogCat
我个人觉得代码跟截图应该挺清晰的说明了问题所在,所以我就不再说明了。
3, singleTask
当活动的启动模式指定为 singleTask。每次启动该活动时系统首先 会在返回栈中检查是否存在该活动的实例。假设发现已经存在则直接使用该实例,并把在这 个活动之上的全部活动统统出栈。假设没有发现就会创建一个新的活动实例。
如今在AndroidManifest.xml中改动Activity的启动模式(android:launchMode="singleTask")
然后在 FirstActivity中加入 onRestart()方法。并打印日志:
@Override protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart");
}
最后在 SecondActivity中加入 onDestroy()方法,并打印日志:
@Override protected void onDestroy() {
super.onDestroy(); Log.d("SecondActivity", "onDestroy");
}
如今又一次执行程序,在 FirstActivity 界面点击button进入到 SecondActivity。然后在 SecondActivity界面点击button,又会又一次进入到 FirstActivity。
然后又一次执行程序。查看 LogCat
4。singleInstance
singleInstance模式应该算是四种启动模式中最特殊也最复杂的一个了,指定为 singleInstance模式的活动会启用一 个新的返回栈来管理这个活动。
我也不好解释,什么都不说了,上代码。
先改动 AndroidManifest. xml中 SecondActivity的启动模式(android:launchMode="singleInstance")
FirstActivity 中 onCreate()方法的代码:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
} }); }
在 onCreate()方法中打印了当前返回栈的 id。
然后改动 SecondActivity中 onCreate()方法 的代码:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(intent);
}});
}
相同在 onCreate()方法中打印了当前返回栈的 id,然后又改动了button点击事件的代码, 用于启动 ThirdActivity。
最后改动 ThirdActivity中 onCreate()方法的代码:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ThirdActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.third_layout);
}
仍然是在 onCreate()方法中打印了当前返回栈的 id。
如今又一次执行程序。在 FirstActivity 界 面 点 击 按 钮 进入 到 SecondActivity, 然 后 在 SecondActivity 界 面 点 击 按 钮 进入 到 ThirdActivity。执行程序。看LogCat中的信息。
这个模式比較麻烦,我也解释不好。能力有限,大家看看截图看看代码自己理解吧。
本文自己胡乱杜撰的,如有雷同纯属巧合(那些原理示意图是网上找的)
本人不承担不论什么看不懂不理解写错的风险!
!!