Standard是活动默认的启动模式,在不进行指定的情况下,所有活动都会自动使用这种启动模式。
众所周知Android时使用返回栈来管理活动的,在standard模式下,每启动一个Activity,他就会在返回栈中入栈并处于栈顶,而在创建新的活动的时候,系统并不会检测新启动的Activity是否在返回栈中、是否在栈顶,而是简单地直接创建。因此,若在一个Activity中创建一个启动其本身的一个开关,在点击后,系统将会创建一个新的Activity,并且覆盖在当前Activity上面,而退出上面的Activity后,显示出来的则是上一个被覆盖的Activity。
1、新建一个名为FirstActivity的项目,修改其中的xml布局文件,添加一个文本为FirstActivity的Button控件。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:orientation="vertical" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <Button 7 android:id="@+id/button1" 8 android:layout_height="wrap_content" 9 android:layout_width="match_parent" 10 android:textAllCaps="false" 11 android:text="FirstActivity" 12 /> 13 14 </LinearLayout>
2、在FirstActivity.java文件中修改代码:在Activity每次跑onCreate和onRestart时打印该活动的信息,并在onCreate中注册按钮点击事件,点击按钮后跳转同一活动。
1 public class FirstActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 Log.d("FirstActivity", "onCreate():" + this.toString());//每次创建该活动时打印 8 Button button1 = (Button) findViewById(R.id.button1); 9 button1.setOnClickListener(new View.OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 Intent intent = new Intent(FirstActivity.this, FirstActivity.class); 13 startActivity(intent); 14 } 15 }); 16 } 17 18 @Override 19 protected void onRestart() { 20 Log.d("FirstActivity", "onRestart():" + this.toString());//每次恢复该活动时打印 21 super.onRestart(); 22 } 23 24 }
3、运行后如下图:
然后打开Android Studio中的Logcat查看打印。
先点击两次FirstAcitvity 按钮,会发现每次打印的FirstActivity后面的编号都不一样,即代表每次都是启动了新的活动,然后点击了三次返回键,最终才退出活动回到桌面,而看打印发现点击第一次返回后活动的编号与第二次启动的活动编号相同,而点击第二次返回后活动的编号与第三次启动的活动编号相同。
总结:
Standard启动模式下,同一个Activity可以有多个实例,因为系统不会检测返回栈中是否拥有该Activity的实例,无论该Activity是否在栈顶。
Standard启动模式示意图: