除了Activity的生命周期外躯泰,Activity的啟動(dòng)模式也是一個(gè)難點(diǎn)憔鬼,有時(shí)候?yàn)榱藵M(mǎn)足項(xiàng)目的特殊需求,就必須使用Activity的啟動(dòng)模式。
在默認(rèn)情況下沙郭,當(dāng)我們多次啟動(dòng)同一個(gè)Activity的時(shí)候,系統(tǒng)會(huì)創(chuàng)建多個(gè)實(shí)例并把它們放入任務(wù)棧中押袍,但是有些場(chǎng)景重復(fù)創(chuàng)建多個(gè)實(shí)例琼开,是沒(méi)有必要且浪費(fèi)資源的,這就需要啟動(dòng)模式來(lái)修改系統(tǒng)的默認(rèn)行為精算。
下面瓢宦,我將以理論+實(shí)踐的形式為大家介紹Activity的啟動(dòng)模式。
standard標(biāo)準(zhǔn)模式
這是系統(tǒng)的默認(rèn)啟動(dòng)模式灰羽,采用這種模式的Activity無(wú)論是否已經(jīng)存在實(shí)例驮履,都會(huì)重新創(chuàng)建一個(gè)實(shí)例鱼辙,在這種模式下誰(shuí)啟動(dòng)了這個(gè)Activity,那么這個(gè)Activity就運(yùn)行在啟動(dòng)它的那個(gè)Activity所在的棧中玫镐。
實(shí)踐: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));
}
//此處省略重復(fù)代碼
@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);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)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
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)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
singleTop棧頂復(fù)用模式
在這種模式下倒戏,如果新的Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會(huì)被重新創(chuàng)建恐似,同時(shí)它的NewIntent
方法將會(huì)被回調(diào)杜跷。如果新Activity的實(shí)例已存在但不是位于棧頂,那么新Activity依然會(huì)被創(chuàng)建矫夷。
實(shí)踐: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));
}
//此處省略重復(fù)代碼
@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);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 18:52:30.963 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onCreate: 0
2022-04-21 18:52:30.968 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onStart: 0
2022-04-21 18:52:30.970 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)MainActivity
2022-04-21 18:52:35.601 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onPause: 0
2022-04-21 18:52:35.603 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onNewIntent: 0
2022-04-21 18:52:35.604 4205-4205/com.hnucm.myapplication I/MainActivityLog: 13onResume: 0
MainActivity 采用 singleTop
模式葛闷,SecondActivity采用 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));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}
}
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
final static String TAG = "SecondActivityLog";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.i(TAG, getTaskId() +"onCreate: " + getIntent().getIntExtra("id",0));
button = findViewById(R.id.button2);
button.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, getTaskId() +"onStart: " + getIntent().getIntExtra("id",0));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button2:
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("id",1);
startActivity(intent);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 18:58:54.961 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onCreate: 0
2022-04-21 18:58:54.964 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onStart: 0
2022-04-21 18:58:54.966 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)SecondActivity
2022-04-21 19:00:13.845 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onPause: 0
2022-04-21 19:00:13.895 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onCreate: 0
2022-04-21 19:00:13.898 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onStart: 0
2022-04-21 19:00:13.900 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onResume: 0
2022-04-21 19:00:14.531 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onStop: 0
2022-04-21 19:00:14.534 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onSaveInstanceState: 0
// 點(diǎn)擊SecondActivity的按鈕啟動(dòng)MainActivity
2022-04-21 19:00:21.287 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onPause: 0
2022-04-21 19:00:21.321 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onCreate: 1
2022-04-21 19:00:21.329 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onStart: 1
2022-04-21 19:00:21.331 4815-4815/com.hnucm.myapplication I/MainActivityLog: 20onResume: 1
2022-04-21 19:00:21.865 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onStop: 0
2022-04-21 19:00:21.866 4815-4815/com.hnucm.myapplication I/SecondActivityLog: 20onSaveInstanceState: 0
singleTask棧內(nèi)復(fù)用模式
這是一種單實(shí)例模式,在這種模式下双藕,只要Activity在一個(gè)棧中存在淑趾,那么多次啟動(dòng)此Activity都不會(huì)重新創(chuàng)建實(shí)例,而是回調(diào)onNewIntent()
忧陪。
實(shí)踐:MainActivity 采用 singleTask
模式
// 核心代碼展示
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));
}
//此處省略重復(fù)代碼
@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);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 19:05:26.977 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onCreate: 0
2022-04-21 19:05:26.981 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onStart: 0
2022-04-21 19:05:26.982 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)MainActivity
2022-04-21 19:05:29.539 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onPause: 0
2022-04-21 19:05:29.540 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onNewIntent: 0
2022-04-21 19:05:29.541 4945-4945/com.hnucm.myapplication I/MainActivityLog: 21onResume: 0
MainActivity 采用 singleTask
模式扣泊,SecondActivity采用 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));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}
}
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
final static String TAG = "SecondActivityLog";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.i(TAG, getTaskId() +"onCreate: " + getIntent().getIntExtra("id",0));
button = findViewById(R.id.button2);
button.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, getTaskId() +"onStart: " + getIntent().getIntExtra("id",0));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button2:
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("id",1);
startActivity(intent);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 19:11:04.891 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onCreate: 0
2022-04-21 19:11:04.894 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onStart: 0
2022-04-21 19:11:04.897 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)SecondActivity
2022-04-21 19:11:18.653 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onPause: 0
2022-04-21 19:11:18.690 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onCreate: 0
2022-04-21 19:11:18.694 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onStart: 0
2022-04-21 19:11:18.696 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onResume: 0
2022-04-21 19:11:19.232 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onStop: 0
2022-04-21 19:11:19.235 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onSaveInstanceState: 0
// 點(diǎn)擊SecondActivity的按鈕啟動(dòng)MainActivity
2022-04-21 19:11:29.909 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onPause: 0
2022-04-21 19:11:29.928 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onRestart: 0
2022-04-21 19:11:29.930 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onStart: 0
2022-04-21 19:11:29.931 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onNewIntent: 0
2022-04-21 19:11:29.932 5045-5045/com.hnucm.myapplication I/MainActivityLog: 22onResume: 0
2022-04-21 19:11:30.498 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onStop: 0
2022-04-21 19:11:30.499 5045-5045/com.hnucm.myapplication I/SecondActivityLog: 22onDestroy: 0
singleInstance單實(shí)例模式
這是一種加強(qiáng)的singleTask
模式,它除了具有singleTask
模式的所有特性外嘶摊,還加強(qiáng)了一點(diǎn)延蟹,那就是具有此模式的Activity只能單獨(dú)的位于一個(gè)任務(wù)棧中。
實(shí)踐:MainActivity 采用 singleInstance
模式
// 核心代碼展示
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));
}
//此處省略重復(fù)代碼
@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);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 19:18:03.183 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onCreate: 0
2022-04-21 19:18:03.186 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onStart: 0
2022-04-21 19:18:03.188 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)MainActivity
2022-04-21 19:18:11.416 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onPause: 0
2022-04-21 19:18:11.419 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onNewIntent: 0
2022-04-21 19:18:11.419 5193-5193/com.hnucm.myapplication I/MainActivityLog: 23onResume: 0
MainActivity 采用 singleInstance
模式叶堆,SecondActivity采用 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));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}
}
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {
final static String TAG = "SecondActivityLog";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.i(TAG, getTaskId() +"onCreate: " + getIntent().getIntExtra("id",0));
button = findViewById(R.id.button2);
button.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, getTaskId() +"onStart: " + getIntent().getIntExtra("id",0));
}
//此處省略重復(fù)代碼
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button2:
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("id",1);
startActivity(intent);
}
}
}
// 日志結(jié)果展示
// 啟動(dòng)MainActivity
2022-04-21 19:19:25.783 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onCreate: 0
2022-04-21 19:19:25.786 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onStart: 0
2022-04-21 19:19:25.787 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onResume: 0
// 點(diǎn)擊MainActivity的按鈕啟動(dòng)SecondActivity
2022-04-21 19:19:34.745 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onPause: 0
2022-04-21 19:19:34.825 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onCreate: 0
2022-04-21 19:19:34.868 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onStart: 0
2022-04-21 19:19:34.871 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onResume: 0
2022-04-21 19:19:35.464 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onStop: 0
2022-04-21 19:19:35.466 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onSaveInstanceState: 0
// 點(diǎn)擊SecondActivity的按鈕啟動(dòng)MainActivity
2022-04-21 19:19:45.068 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onPause: 0
2022-04-21 19:19:45.078 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onRestart: 0
2022-04-21 19:19:45.079 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onStart: 0
2022-04-21 19:19:45.080 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onNewIntent: 0
2022-04-21 19:19:45.081 5261-5261/com.hnucm.myapplication I/MainActivityLog: 24onResume: 0
2022-04-21 19:19:45.802 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onStop: 0
2022-04-21 19:19:45.803 5261-5261/com.hnucm.myapplication I/SecondActivityLog: 25onSaveInstanceState: 0
以上就是Activity啟動(dòng)模式的介紹阱飘。
歡迎留言指出錯(cuò)誤。