1.标准情况下的生命周期:

2.代码说明:
package com.stackdump.myapplication; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class MainActivity extends AppCompatActivity { //需要判断Bundle是否为Null @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("info","lsm onCreate"); if (savedInstanceState != null) { String test = savedInstanceState.getString("extra_test"); Log.d("info", "[onCreate]restore extra_test:" + test); } } @Override protected void onRestart() { super.onRestart(); Log.d("info"," onRestart"); } @Override protected void onStart() { super.onStart(); Log.d("info"," onStart"); } //1.该方法的调用和activity的启动模式有关 //2.调用该方法,onCreate和onStart不会被调用 //3.若启动模式是singleTask,该activity重复调用启动该activity,生命周期:onPause->onNewIntent->onResume @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); } //1.调用时机在onStart之后 //2.一旦被调用,Bundle不为空,不用判断是否为Null //3.官方建议该方法恢复数据,而不是onCreate @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.d("info"," onRestoreInstanceState"); String test = savedInstanceState.getString("extra_test"); Log.d("info", "[onRestoreInstanceState]restore extra_test:" + test); } //1.xml中指定configChanges="orientation|screenSize",不会调用onSaveInstanceState方法而是调用该方法,且不调用生命周期 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d("info"," onConfigurationChanged"); } @Override protected void onResume() { super.onResume(); Log.d("info"," onResume"); } @Override protected void onPause() { super.onPause(); Log.d("info"," onPause"); } //1.调用时间在onStop之前,与onPause没有既定顺序 //2.Activity异常退出会被调用,比如: // 1)资源相关的系统配置发生改变导致Activity被杀死并重新创建(屏幕切换) // 2)资源内存不足导致低优先级的Activity被杀死 //3.即将被销毁并且有机会重新显示的情况下才会被调用;正常销毁系统不会调用 //4.举例: // 1)屏幕切换:onPause->onSaveInstanceState->onStop->onDestroy // 2)来电:onPause->onSaveInstanceState->onStop,挂电:onRestart->onStart->onResume @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.d("info"," onSaveInstanceState"); outState.putString("extra_test", "test"); } @Override protected void onStop() { super.onStop(); Log.d("info"," onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("info"," onDestroy"); } }
总结:
1.onStart和onStop是从Activity是否可见的角度来回调,onResume和onPause是从Activity是否位于前台这个角度来回调,实际使用中无其他明显区别。
2.当栈中无任何Activity时,系统会回收这个任务栈。
3.standard模式的activity运行在启动它的那个Activity所在的栈中。如果是ApplicationContext去启动standard模式的activity,需要指定FLAG_ACTIVITY_NEW_TASK标记位,此时,实际上Activity是以singleTask模式启动的。
0