更新时间:2022-01-06
android-30
ActivityLifecycleCallbacks 是 Application 的一个接口;
Activity 的生命周期,对应 ActivityLifecycleCallbacks 中的方法;
当实现ActivityLifecycleCallbacks 接口后,在 MainActivity中调用 super.onCreate后,最终再调用实现的ActivityLifecycleCallbacks 的 onActivityCreated 实现方法。
源码分析
1)ActivityLifecycleCallbacks接口
public interface ActivityLifecycleCallbacks {
/**
* Called when the Activity calls {@link Activity#onCreate super.onCreate()}.
*/
void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState);
/**
* Called when the Activity calls {@link Activity#onStart super.onStart()}.
*/
void onActivityStarted(@NonNull Activity activity);
/**
* Called when the Activity calls {@link Activity#onResume super.onResume()}.
*/
void onActivityResumed(@NonNull Activity activity);
/**
* Called when the Activity calls {@link Activity#onPause super.onPause()}.
*/
void onActivityPaused(@NonNull Activity activity);
/**
* Called when the Activity calls {@link Activity#onStop super.onStop()}.
*/
void onActivityStopped(@NonNull Activity activity);
/**
* Called when the Activity calls
* {@link Activity#onSaveInstanceState super.onSaveInstanceState()}.
*/
void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState);
/**
* Called when the Activity calls {@link Activity#onDestroy super.onDestroy()}.
*/
void onActivityDestroyed(@NonNull Activity activity);
}
2)分析ActivityLifecycleCallbacks是在什么时候被调用的
2.1)查看 MainActivity
在 MainActivity 中,会在 super.onCreate 中去调用 ActivityLifecycleCallbacks 的 onCreate 方法,进入到 super.onCreate看下内容
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2.2)FragmentActivity # onCreate
再进入 super.onCreate 去看下
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
mFragments.dispatchCreate();
}
2.3)ComponentActivity # onCreate
再进入 super.onCreate 中
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// Restore the Saved State first so that it is available to
// OnContextAvailableListener instances
mSavedStateRegistryController.performRestore(savedInstanceState);
mContextAwareHelper.dispatchOnContextAvailable(this);
super.onCreate(savedInstanceState);
mActivityResultRegistry.onRestoreInstanceState(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
2.4)ComponentActivity # onCreate
再次进入 super.onCreate 中
@SuppressLint("RestrictedApi")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
2.5)Activity # onCreate
dispatchActivityCreated(savedInstanceState); 这里就会去调用了,再进入去看看
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);
if (mLastNonConfigurationInstances != null) {
mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
}
if (mActivityInfo.parentActivityName != null) {
if (mActionBar == null) {
mEnableDefaultActionBarUp = true;
} else {
mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
}
}
if (savedInstanceState != null) {
mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);
mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID,
View.LAST_APP_AUTOFILL_ID);
if (mAutoFillResetNeeded) {
getAutofillManager().onCreate(savedInstanceState);
}
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
// 这里就会去调用了
dispatchActivityCreated(savedInstanceState);
if (mVoiceInteractor != null) {
mVoiceInteractor.attachActivity(this);
}
mRestoredFromBundle = savedInstanceState != null;
mCalled = true;
}
2.6)Activity # dispatchActivityCreated
这里调用了 ActivityLifecycleCallbacks 的 onActivityCreated 方法了
private void dispatchActivityCreated(@Nullable Bundle savedInstanceState) {
getApplication().dispatchActivityCreated(this, savedInstanceState);
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = 0; i < callbacks.length; i++) {
((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityCreated(this,
savedInstanceState);
}
}
}
代码演示
1)创建MyApplication
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
public static final String TAG = "MyApplication";
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
Log.d(TAG, "onActivityCreated: " + activity);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
Log.d(TAG, "onActivityStarted: " + activity);
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
Log.d(TAG, "onActivityResumed: " + activity);
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
Log.d(TAG, "onActivityPaused: " + activity);
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
Log.d(TAG, "onActivityStopped: " + activity);
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
Log.d(TAG, "onActivitySaveInstanceState: " + activity);
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
Log.d(TAG, "onActivityDestroyed: " + activity);
}
}
2)修改 AndroidManifest.xml
增加:
android:name=".MyApplication"
3)效果
D/MyApplication: onActivityCreated: com.example.testlifecycle.MainActivity@e9f5a06
D/MyApplication: onActivityStarted: com.example.testlifecycle.MainActivity@e9f5a06
D/MyApplication: onActivityResumed: com.example.testlifecycle.MainActivity@e9f5a06
D/MyApplication: onActivityPaused: com.example.testlifecycle.MainActivity@e9f5a06
D/MyApplication: onActivityStopped: com.example.testlifecycle.MainActivity@e9f5a06
D/MyApplication: onActivityDestroyed: com.example.testlifecycle.MainActivity@e9f5a06
好记性不如烂笔头!