Android activity的启动模式
Posted 我不是地球朲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 界面点击按钮进入到 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中的信息。
这个模式比较麻烦,我也解释不好,能力有限,大家看看截图看看代码自己理解吧。
本文自己胡乱杜撰的,如有雷同纯属巧合(那些原理示意图是网上找的)
本人不承担任何看不懂不理解写错的风险!!!
以上是关于Android activity的启动模式的主要内容,如果未能解决你的问题,请参考以下文章