自己的理解加上网上的一些资料总结了关于activity的四种启动模式

在实际项目中我们应该依据特定的需求 为每一个活动指定恰当的启动模式。启动模式一共同拥有四种,各自是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 过给标签 指定 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中的信息。

这个模式比較麻烦,我也解释不好。能力有限,大家看看截图看看代码自己理解吧。

本文自己胡乱杜撰的,如有雷同纯属巧合(那些原理示意图是网上找的)

本人不承担不论什么看不懂不理解写错的风险!!!

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。