Android的Activity的四种加载模式解析
2012-09-12 11:33
555 查看
一.在android中有几种启动Activity的模式?
standard(默认):每次都会新建。(每个Task都可以有,且可以有多个实例)。
singleTop:当前实例如果在栈顶,就不可以新建实例。(每个Task都可以有,且可以有多个实例,在栈顶的时候可以复 用)
singleTask:新建一个Task,如果有其它Task包含此实例,就直接调用那个Task。(只存在一个Task中)
singleInstance:新建一个Task,且该Task中只有其一个实例。(只存在一个Task中,且此Task中只有此一个实例)
其次有必要先解释下Task这个概念:Task就是栈的意思,一个android应用的创建,则创建了一个Task,当每创建一个activity的时候,就将activity压入Task中。
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
接下来以Demo的形式分别解释这四种模式:
standard:
再次我们定义一个类A,通过A->A,再返回的形式来展现。
通过结果我们可以看见当不断点击按钮生成的是不同的对象实例。再点击返回按钮的时候,返回上一个对象实例。
其实这就相当于一个压栈的过程。
singleTop:其实singleTop和standard的区别就在于其创建的实例是否在栈顶。
此时我们将刚才那个Demo的launchMode改成standard。
此时发现不管点击多少次按钮,都是同一个实例。且当按back健的时候,退出程序了。原因很简单,因为类LaunchModeActivity_A是在栈顶。
singleTask:
定义A类跳转到B类,再定义一个B类跳转到A类。其中设置A类的启动方式为:singleTask。B类的启动方式为:standard。
A类:
B类:
结果会发现A跳转到B,创建了一个新的实例,当B再跳转到A时,仍然是刚才的实例。因为启动A的方式是singleTask。A中包含了此实例,所以当再次启动的时候intent会直接传递给这个已创建的实例对象。
singleInstance:在这个模式之下,activity独享一个Task,此时一个Task只有一个activity。
仍然使用上面的A和B类,将A类的启动模式改为standard,把B的启动模式改为singleInstance。
当点击跳转A到B,再从B跳转到A,然后back的时候,一般情况下应该是跳到B界面,但是这次全是A界面,并且当B
跳转到A得时候创建一个新的实例在另一个Task中,并非同一个Task,结果如下图:
standard(默认):每次都会新建。(每个Task都可以有,且可以有多个实例)。
singleTop:当前实例如果在栈顶,就不可以新建实例。(每个Task都可以有,且可以有多个实例,在栈顶的时候可以复 用)
singleTask:新建一个Task,如果有其它Task包含此实例,就直接调用那个Task。(只存在一个Task中)
singleInstance:新建一个Task,且该Task中只有其一个实例。(只存在一个Task中,且此Task中只有此一个实例)
其次有必要先解释下Task这个概念:Task就是栈的意思,一个android应用的创建,则创建了一个Task,当每创建一个activity的时候,就将activity压入Task中。
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
接下来以Demo的形式分别解释这四种模式:
standard:
再次我们定义一个类A,通过A->A,再返回的形式来展现。
package com.android.douf; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class LaunchModeActivity_A extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + ""); Button button = new Button(this); button.setText("go:"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_A.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }
通过结果我们可以看见当不断点击按钮生成的是不同的对象实例。再点击返回按钮的时候,返回上一个对象实例。
其实这就相当于一个压栈的过程。
singleTop:其实singleTop和standard的区别就在于其创建的实例是否在栈顶。
此时我们将刚才那个Demo的launchMode改成standard。
此时发现不管点击多少次按钮,都是同一个实例。且当按back健的时候,退出程序了。原因很简单,因为类LaunchModeActivity_A是在栈顶。
singleTask:
定义A类跳转到B类,再定义一个B类跳转到A类。其中设置A类的启动方式为:singleTask。B类的启动方式为:standard。
A类:
package com.android.douf; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class LaunchModeActivity_A extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText(this + ""); Button button = new Button(this); button.setText("go:"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_B.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }
B类:
package com.android.douf; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; public class LaunchModeActivity_B extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button button=new Button(this); button.setText("go actA"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(LaunchModeActivity_B.this, LaunchModeActivity_A.class); startActivity(intent); } }); LinearLayout layout=new LinearLayout(this); layout.addView(button); this.setContentView(layout); } }
结果会发现A跳转到B,创建了一个新的实例,当B再跳转到A时,仍然是刚才的实例。因为启动A的方式是singleTask。A中包含了此实例,所以当再次启动的时候intent会直接传递给这个已创建的实例对象。
singleInstance:在这个模式之下,activity独享一个Task,此时一个Task只有一个activity。
仍然使用上面的A和B类,将A类的启动模式改为standard,把B的启动模式改为singleInstance。
当点击跳转A到B,再从B跳转到A,然后back的时候,一般情况下应该是跳到B界面,但是这次全是A界面,并且当B
跳转到A得时候创建一个新的实例在另一个Task中,并非同一个Task,结果如下图:
相关文章推荐
- 转载 android activity的四种加载模式
- Android四种Activity的加载模式
- Android学习记录(8)—Activity的四种加载模式及有关Activity横竖屏切换的问题
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- android activity的四种加载模式
- Android Activity的四种加载模式
- Android四种Activity的加载模式
- android开发笔记之 Activity四种加载模式
- Android四种Activity的加载模式【转】
- Android四种Activity的加载模式
- android---------区分Activity的四种加载模式
- android编程之区分Activity的四种加载模式
- Android四种Activity的加载模式
- Android基础知识回顾--Activity四种加载模式分析
- Android Activity的四种加载模式
- Android Activity四种加载模式
- Android四种Activity的加载模式
- Activity的四种加载模式 android:launchMode
- android - 详解Activity的四种加载模式