赞
踩
除了Activity的生命周期外,Activity的启动模式也是一个难点,有时候为了满足项目的特殊需求,就必须使用Activity的启动模式。
在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,但是有些场景重复创建多个实例,是没有必要且浪费资源的,这就需要启动模式来修改系统的默认行为。
下面,我将以理论+实践的形式为大家介绍Activity的启动模式。
这是系统的默认启动模式,采用这种模式的Activity无论是否已经存在实例,都会重新创建一个实例,在这种模式下谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
实践:MainActivity 采用 standard
模式
// 核心代码展示 public class MainActivity extends AppCompatActivity implements View.OnClickListener { final static String TAG = "MainActivityLog"; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, getTaskId() + "onCreate: " + getIntent().getIntExtra("id",0)); button = findViewById(R.id.button); button.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i(TAG, getTaskId() +"onStart: " + getIntent().getIntExtra("id",0)); } //此处省略重复代码 @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: Intent intent = new Intent(this,MainActivity.class); intent.putExtra("id",1); startActivity(intent); } } }
// 日志结果展示
// 启动MainActivity
2022-04-21 18:37:59.622 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onCreate: 0
2022-04-21 18:37:59.625 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onStart: 0
2022-04-21 18:37:59.626 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onResume: 0
// 点击MainActivity的按钮启动MainActivity
2022-04-21 18:38:03.336 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onPause: 0
2022-04-21 18:38:03.373 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onCreate: 1
2022-04-21 18:38:03.378 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onStart: 1
2022-04-21 18:38:03.379 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onResume: 1
2022-04-21 18:38:03.939 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onStop: 0
2022-04-21 18:38:03.942 4072-4072/com.hnucm.myapplication I/MainActivityLog: 12onSaveInstanceState: 0
在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的NewIntent
方法将会被回调。如果新Activity的实例已存在但不是位于栈顶,那么新Activity依然会被创建。
实践:MainActivity 采用 singleTop
模式
// 核心代码展示 public class MainActivity extends AppCompatActivity implements View.OnClickListener { final static String TAG = "MainActivityLog"; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, getTaskId() + "onCreate: " + getIntent().getIntExtra("id",0)); button = findViewById(R.id.button); button.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i(TAG, getTaskId() +"onStart: " + getIntent().getIntExtra("id",0)); } //此处省略重复代码 @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: Intent intent = new Intent(this,MainActivity.class); intent.putExtra("id",</
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。