Activity生命周期源码梳理

119 阅读6分钟

Android Activity的生命周期是Android应用开发中的一个核心概念,它描述了Activity从创建到销毁所经历的不同状态。
onCreate():当Activity第一次被创建时调用,这是Activity生命周期的第一个回调方法。
onStart():Activity对用户可见时调用。此时Activity虽然可见,但还不能与用户交互。可以在此阶段进行一些动画效果的初始化或准备工作。
onResume():Activity获取焦点,可以与用户交互时调用。此时Activity处于前台运行状态。在此阶段,Activity可以响应用户的输入和操作。
onPause():Activity失去焦点,但仍对用户可见时调用。例如,当新的Activity或对话框出现时。在此方法中,应保存关键数据和执行轻量级的资源释放操作,以应对Activity可能被随时销毁的情况。
onStop():Activity不再对用户可见时调用。此时Activity虽然保留在内存中,但不再显示。执行更重量级的资源释放操作,如断开数据库连接、停止动画等。 onDestroy():Activity被销毁时调用。此时Activity将释放所有占用的资源。清理Activity中使用的所有资源,避免内存泄漏。
onRestart():Activity在停止状态下重新变为可见时调用。例如,用户从后台返回到该Activity。重新获取Activity的状态和资源,准备与用户交互。

本文以Android 13代码对例对Activity生命周期进行梳理。
1,在frameworks/base/core/java/android/app/ClientTransactionHandler.java中

public abstract class ClientTransactionHandler {
	 void scheduleTransaction(ClientTransaction transaction) {
         transaction.preExecute(this);
         sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);//在ActivityThread类中定义有class H extends Handler
     }
}

上面的代码发送EXECUTE_TRANSACTION消息。
2,在frameworks/base/core/java/android/app/ActivityThread.java中

private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
public void handleMessage(Message msg) {
	switch (msg.what) {
		case EXECUTE_TRANSACTION:
            final ClientTransaction transaction = (ClientTransaction) msg.obj;
            mTransactionExecutor.execute(transaction);//调用TransactionExecutor类的execute函数
		break;
	}
}

3,在frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java中

public class TransactionExecutor {
	public void execute(ClientTransaction transaction) {
		executeCallbacks(transaction);//调用TransactionExecutor类的executeCallbacks函数
		executeLifecycleState(transaction); //调用executeLifecycleState函数
	}
	
	private void executeLifecycleState(ClientTransaction transaction) {
		final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest(); //获取当前事务中的生命周期状态请求
		
		// Cycle to the state right before the final requested state.
		//通过cycleToPath(r, lifecycleItem.getTargetState(), true, transaction);方法,将Activity的状态变更到最终请求状态之前的状态。
		//这里的逻辑是为了确保Activity按照正确的顺序通过生命周期的各个状态,excludeLastState参数为真表示排除最终请求的状态本身,只到达其前一个状态。
		cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);  //调用cycleToPath方法
		
		// Execute the final transition with proper parameters.
		//通过lifecycleItem.execute(mTransactionHandler, token, mPendingActions);执行最终的生命周期转换。这一步会根据lifecycleItem中包含的指令(如启动、暂停、恢复等)来更新Activity的状态。
		lifecycleItem.execute(mTransactionHandler, token, mPendingActions); //有StartActivityItem,StopActivityItem,DestroyActivityItem,ResumeActivityItem,PauseActivityItem等类文件继承自ActivityLifecycleItem.java,执行execute函数。
		lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);//通过lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);执行生命周期转换后的后续操作。这可能包括清理资源、更新UI等。
	}
	
	@VisibleForTesting
    public void cycleToPath(ActivityClientRecord r, int finish, ClientTransaction transaction) {
        cycleToPath(r, finish, false /* excludeLastState */, transaction);
    }
	
	private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
            ClientTransaction transaction) {
        final int start = r.getLifecycleState();
        if (DEBUG_RESOLVER) {
            Slog.d(TAG, tId(transaction) + "Cycle activity: "
                    + getShortActivityName(r.token, mTransactionHandler)
                    + " from: " + getStateName(start) + " to: " + getStateName(finish)
                    + " excludeLastState: " + excludeLastState);
        }
        final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
        performLifecycleSequence(r, path, transaction); //调用performLifecycleSequence方法
    }
	
	private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
            ClientTransaction transaction) {
        final int size = path.size();
        for (int i = 0, state; i < size; i++) {
            state = path.get(i);
            if (DEBUG_RESOLVER) {
                Slog.d(TAG, tId(transaction) + "Transitioning activity: "
                        + getShortActivityName(r.token, mTransactionHandler)
                        + " to state: " + getStateName(state));
            }
            switch (state) {
                case ON_CREATE:
                    mTransactionHandler.handleLaunchActivity(r, mPendingActions,
                            null /* customIntent */);
                    break;
                case ON_START:
                    mTransactionHandler.handleStartActivity(r, mPendingActions,
                            null /* activityOptions */);
                    break;
                case ON_RESUME:
                    mTransactionHandler.handleResumeActivity(r, false /* finalStateRequest */,
                            r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
                    break;
                case ON_PAUSE:
                    mTransactionHandler.handlePauseActivity(r, false /* finished */,
                            false /* userLeaving */, 0 /* configChanges */, mPendingActions,
                            "LIFECYCLER_PAUSE_ACTIVITY");
                    break;
                case ON_STOP:
                    mTransactionHandler.handleStopActivity(r, 0 /* configChanges */,
                            mPendingActions, false /* finalStateRequest */,
                            "LIFECYCLER_STOP_ACTIVITY");
                    break;
                case ON_DESTROY:
                    mTransactionHandler.handleDestroyActivity(r, false /* finishing */,
                            0 /* configChanges */, false /* getNonConfigInstance */,
                            "performLifecycleSequence. cycling to:" + path.get(size - 1));
                    break;
                case ON_RESTART:
                    mTransactionHandler.performRestartActivity(r, false /* start */);
                    break;
                default:
                    throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
            }
        }
    }
}

在上面的performLifecycleSequence函数中,对应不同的生命周期状态,调用不同的函数处理。在函数cycleToPath中调用TransactionExecutorHelper.java类的getLifecyclePath函数来获取生命周期状态序列。
4,在frameworks/base/core/java/android/app/servertransaction/TransactionExecutorHelper.java中

public class TransactionExecutorHelper {
	public IntArray getLifecyclePath(int start, int finish, boolean excludeLastState) {
		mLifecycleSequence.clear(); //清除之前可能存在的生命周期序列
        if (finish >= start) {
            if (start == ON_START && finish == ON_STOP) {
                // A case when we from start to stop state soon, we don't need to go
                // through the resumed, paused state.
                mLifecycleSequence.add(ON_STOP); //对于从ON_START到ON_STOP的转换,由于Activity在ON_STOP时不会经过ON_RESUME和ON_PAUSE,所以直接添加ON_STOP。
            } else {
                // just go there
                for (int i = start + 1; i <= finish; i++) { //通过循环将需要经过的生命周期状态添加到mLifecycleSequence中
                    mLifecycleSequence.add(i);
                }
            }
        } else { // finish < start, can't just cycle down
            if (start == ON_PAUSE && finish == ON_RESUME) {
                // Special case when we can just directly go to resumed state.
                mLifecycleSequence.add(ON_RESUME); //如果需要从ON_PAUSE直接转换到ON_RESUME(这通常不是正常流程,但这里作为特殊情况处理),则直接添加ON_RESUME。
            } else if (start <= ON_STOP && finish >= ON_START) {
                // Restart and go to required state.
        
                // Go to stopped state first.
                for (int i = start + 1; i <= ON_STOP; i++) {
                    mLifecycleSequence.add(i);
                }
                // Restart
                 mLifecycleSequence.add(ON_RESTART);
                 // Go to required state
                 for (int i = ON_START; i <= finish; i++) {
                     mLifecycleSequence.add(i);
                 }
             } else {
                 // Relaunch and go to required state
        
                 // Go to destroyed state first.
                 for (int i = start + 1; i <= ON_DESTROY; i++) {
                     mLifecycleSequence.add(i);
                 }
                 // Go to required state
                 for (int i = ON_CREATE; i <= finish; i++) {
                     mLifecycleSequence.add(i);
                 }
             }
        }
		return mLifecycleSequence; //返回构建好的生命周期状态序列
	}
}

5,在frameworks/base/core/java/android/app/ClientTransactionHandler.java中

public abstract class ClientTransactionHandler {
	/** Perform activity launch. */
    public abstract Activity handleLaunchActivity(@NonNull ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent);
    
    /** Perform activity start. */
    public abstract void handleStartActivity(@NonNull ActivityClientRecord r,PendingTransactionActions pendingActions, ActivityOptions activityOptions);
	...
}

上面的代码定义了一系列生命周期的处理函数。ClientTransactionHandler.java为抽象类,ActivityThread继承自ClientTransactionHandler类。即public final class ActivityThread extends ClientTransactionHandler。
6,在frameworks/base/core/java/android/app/ActivityThread.java中

public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal {

	public Activity handleLaunchActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, Intent customIntent) {
		final Activity a = performLaunchActivity(r, customIntent);
		return a;
	}
	
	private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
			java.lang.ClassLoader cl = appContext.getClassLoader();
			activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);//创建新的activity
			activity.attach(...); //attach 方法中主要做了初始化 PhoneWindow 的一些操作
			
			r.activity = activity;
			if (r.isPersistable()) {
			    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
			} else {
			    mInstrumentation.callActivityOnCreate(activity, r.state);
			}
			
			return activity;
	}
			
			

	public void handleStartActivity(ActivityClientRecord r,PendingTransactionActions pendingActions, ActivityOptions activityOptions) {
        final Activity activity = r.activity;
		// Start
        activity.performStart("handleStartActivity"); //调用performStart函数
        r.setState(ON_START); //将ActivityClientRecord的状态更新为ON_START,表示Activity现在处于onStart阶段
		
		updateVisibility(r, true /* show */); //调用updateVisibility来更新Activity的可见性
        mSomeActivitiesChanged = true;
	}
}

上面的代码中:对于handleLaunchActivity,会通过performLaunchActivity进一步调用到Instrumentation.java类的callActivityOnCreate函数。对于handleStartActivity,会直接调用到Activity类的performStart函数。
7,在frameworks/base/core/java/android/app/Instrumentation.java中

public class Instrumentation {
	
	public void callActivityOnCreate(Activity activity, Bundle icicle,PersistableBundle persistentState) {
	    prePerformCreate(activity);
	    activity.performCreate(icicle, persistentState); // 调用performCreate函数
	    postPerformCreate(activity);
	}
	
	public void callActivityOnStart(Activity activity) {
	    activity.onStart(); //调用activity的onStart函数
	}
}

8,在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 performCreate(Bundle icicle) {
	    performCreate(icicle, null);
	}
	final void performCreate(Bundle icicle, PersistableBundle persistentState) {
		if (persistentState != null) {
	        onCreate(icicle, persistentState); // 调用onCreate函数
	    } else {
	        onCreate(icicle);
	    }
	}
	
	final void performStart(String reason) {
		mInstrumentation.callActivityOnStart(this); //调用callActivityOnStart
		mFragments.dispatchStart();
	    mFragments.reportLoaderStart();
	}
}

9,在frameworks/base/core/java/android/app/Application.java中

public class Application extends ContextWrapper implements ComponentCallbacks2 {
	private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();
	
	public interface ActivityLifecycleCallbacks {
		void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState);
		void onActivityStarted(@NonNull Activity activity);
		void onActivityResumed(@NonNull Activity activity);
		void onActivityPaused(@NonNull Activity activity);
		void onActivityStopped(@NonNull Activity activity);
		void onActivityDestroyed(@NonNull Activity activity);
	}
	
	public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
	    synchronized (mActivityLifecycleCallbacks) {
	        mActivityLifecycleCallbacks.add(callback);
	    }
	}
	
	public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
	    synchronized (mActivityLifecycleCallbacks) {
	        mActivityLifecycleCallbacks.remove(callback);
	    }
	}
    /* package */ void dispatchActivityCreated(@NonNull Activity activity,
	         @Nullable Bundle savedInstanceState) {
	     Object[] callbacks = collectActivityLifecycleCallbacks();
	     if (callbacks != null) {
	         for (int i=0; i<callbacks.length; i++) {
	             ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
	                     savedInstanceState);
	         }
	     }
	 }
	 
	 /* package */ void dispatchActivityStarted(@NonNull Activity activity) {
	     Object[] callbacks = collectActivityLifecycleCallbacks();
	     if (callbacks != null) {
	         for (int i=0; i<callbacks.length; i++) {
	             ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
	         }
	     }
	 }  
}

在上面的代码中,registerActivityLifecycleCallbacks用来对应用的Activity的生命周期进行集中管理。 可以在application中ActivityLifecycleCallbacks lifecycleCallbacks = new ActivityLifecycleCallbacks() {...}; registerActivityLifecycleCallbacks(lifecycleCallbacks);
10,在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 final ArrayList<Application.ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<Application.ActivityLifecycleCallbacks>();
	
	public void registerActivityLifecycleCallbacks(@NonNull Application.ActivityLifecycleCallbacks callback) {
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.add(callback);
        }
    }
	
	public void unregisterActivityLifecycleCallbacks(@NonNull Application.ActivityLifecycleCallbacks callback) {
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.remove(callback);
        }
    }
	
	protected void onCreate(@Nullable Bundle savedInstanceState) {
		dispatchActivityCreated(savedInstanceState);
	}
	
	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);
            }
        }
    }
	
	protected void onStart() {
		dispatchActivityStarted();
	}
	
	private void dispatchActivityStarted() {
		getApplication().dispatchActivityStarted(this);
	}
	
}

上面的代码中,在activity的每个生命周期执行之后都会执行对应生命周期的回调接口,比如onCreate函数调用dispatchActivityCreated,onStart函数调用dispatchActivityStarted等。