Activity的performStop用于执行ActivityStop,代码如下:
//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
ContentCaptureManager.ContentCaptureClient {
final void performStop(boolean preserveWindow, String reason) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "performStop:"
+ mComponent.getClassName());
}
mDoReportFullyDrawn = false;
mFragments.doLoaderStop(mChangingConfigurations /*retain*/);
// Disallow entering picture-in-picture after the activity has been stopped
mCanEnterPictureInPicture = false;
if (!mStopped) {
dispatchActivityPreStopped();
if (mWindow != null) {
mWindow.closeAllPanels();
}
// If we're preserving the window, don't setStoppedState to true, since we
// need the window started immediately again. Stopping the window will
// destroys hardware resources and causes flicker.
if (!preserveWindow && mToken != null && mParent == null) {
WindowManagerGlobal.getInstance().setStoppedState(mToken, true);
}
mFragments.dispatchStop();
mCalled = false;
mInstrumentation.callActivityOnStop(this);
EventLogTags.writeWmOnStopCalled(mIdent, getComponentName().getClassName(), reason);
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
" did not call through to super.onStop()");
}
synchronized (mManagedCursors) {
final int N = mManagedCursors.size();
for (int i=0; i<N; i++) {
ManagedCursor mc = mManagedCursors.get(i);
if (!mc.mReleased) {
mc.mCursor.deactivate();
mc.mReleased = true;
}
}
}
mStopped = true;
dispatchActivityPostStopped();
}
mResumed = false;
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
上面方法主要处理如下:
1、调用mInstrumentation(Instrumentation)的callActivityOnStop方法。
2、调用Activity的dispatchActivityPostStopped方法。
下面分别进行分析:
Instrumentation callActivityOnStop
调用mInstrumentation(Instrumentation)的callActivityOnStop方法:
//frameworks/base/core/java/android/app/Instrumentation.java
public class Instrumentation {
public void callActivityOnStop(Activity activity) {
activity.onStop();
}
}
Activity onStop
调用Activity的onStop方法:
void onStop():当您不再对用户可见时调用。
在其子类(应用程序实现)的onStop会调用super.onStop()方法:
//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
ContentCaptureManager.ContentCaptureClient {
protected void onStop() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this);
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
mActivityTransitionState.onStop(this);
dispatchActivityStopped();
mTranslucentCallback = null;
mCalled = true;
getAutofillClientController().onActivityStopped(mIntent, mChangingConfigurations);
mEnterAnimationComplete = false;
}
}
Activity dispatchActivityStopped
调用Activity的dispatchActivityStopped方法:
//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
ContentCaptureManager.ContentCaptureClient {
private void dispatchActivityStopped() {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = callbacks.length - 1; i >= 0; i--) {
((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityStopped(this);
}
}
getApplication().dispatchActivityStopped(this);
}
}
Application.ActivityLifecycleCallbacks onActivityStopped
调用Application.ActivityLifecycleCallbacks的onActivityStopped方法,如果应用程序调用了Application的registerActivityLifecycleCallbacks,就会收到onActivityStopped回调。
void onActivityStopped(@NonNull Activity activity):当 Activity 调用 {@link Activity#onStop super.onStop()} 时调用。
Activity dispatchActivityPostStopped
调用Activity的dispatchActivityPostStopped方法:
//frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
ContentCaptureManager.ContentCaptureClient {
private void dispatchActivityPostStopped() {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = callbacks.length - 1; i >= 0; i--) {
((Application.ActivityLifecycleCallbacks) callbacks[i])
.onActivityPostStopped(this);
}
}
getApplication().dispatchActivityPostStopped(this);
}
}
Application.ActivityLifecycleCallbacks onActivityPostStopped
调用Application.ActivityLifecycleCallbacks的onActivityPostStopped方法,如果应用程序调用了Application的registerActivityLifecycleCallbacks,就会收到onActivityPostStopped回调。
void onActivityPostStopped(@NonNull Activity activity):作为正在停止的活动的最后一步调用。这始终在 {@link Activity#onStop} 之后调用。