欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android activity的启动模式

来源: 开发者 投稿于  被查看 21079 次 评论:199

Android activity的启动模式


自己的理解加上网上的一些资料总结了关于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 界面点击按钮进入到 SecondActivity,然后在 SecondActivity界面点击按钮,又会重新进入到 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,然后又修改了按钮点击事件的代码, 用于启动 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中的信息。

\

\

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

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

本人不承担任何看不懂不理解写错的风险!!!

用户评论