Android Activity的四种加载模式
转自 http://marshal.easymorse.com/archives/2950
区分Activity的四种加载模式
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。
加载模式分类及在哪里配置
Activity有四种加载模式:
standard
singleTop
singleTask
singleInstance
设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
<activity android:name="ActB" android:launchMode="singleTask"></activity>
也可以在Eclipse ADT中图形界面中编辑
区分Activity的加载模式,通过示例一目了然。这里编写了一个Activity A(ActA)和Activity B(ActB)循环跳转的例子。对加载模式修改和代码做稍微改动,就可以说明四种模式的区别。
standard首先说standard模式,也就是默认模式,不需要配置launchMode。先只写一个名为ActA的Activity:
package com.easymorse.activities; 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 ActA 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 actA"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActA.this, ActA.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }例子中都没有用layout,免得看着罗嗦。可见是ActA –> ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。
package com.easymorse.activities; 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 ActA 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 actB"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActA.this, ActB.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } }
package com.easymorse.activities; 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 ActB 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(ActB.this, ActA.class); startActivity(intent); } }); LinearLayout layout=new LinearLayout(this); layout.addView(button); this.setContentView(layout); } }