Activity 的销毁流程

销毁 Activity 时序图 Activity -> ATMS

销毁 Activity 时序图 ATMS -> ActivityThread -> Activity

// frameworks/base/core/java/android/app/Activity.java
public void finish() {
    finish(DONT_FINISH_TASK_WITH_ACTIVITY); // 1
}

@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private void finish(int finishTask) {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (false) Log.v(TAG, "Finishing self: token=" + mToken);
        if (resultData != null) {
            resultData.prepareToLeaveProcess(this);
        }
        if (ActivityClient.getInstance().finishActivity(mToken, resultCode, resultData,
                finishTask)) { // 2
            mFinished = true;
        }
    } else {
        mParent.finishFromChild(this);
    }

    getAutofillClientController().onActivityFinish(mIntent);
}
// frameworks/base/core/java/android/app/ActivityClient.java
public static ActivityClient getInstance() {
    return sInstance.get();
}

public boolean finishActivity(IBinder token, int resultCode, Intent resultData,
        int finishTask) {
    try {
        return getActivityClientController().finishActivity(token, resultCode, resultData,
                finishTask); // 3
    } catch (RemoteException e) {
        throw e.rethrowFromSystemServer();
    }
}

private static IActivityClientController getActivityClientController() {
    final IActivityClientController controller = INTERFACE_SINGLETON.mKnownInstance;
    return controller != null ? controller : INTERFACE_SINGLETON.get();
}
// frameworks/base/core/java/android/app/IActivityClientController.aidl
interface IActivityClientController {
		boolean finishActivity(in IBinder token, int code, in Intent data, int finishTask);
}
// frameworks/base/services/core/java/com/android/server/wm/ActivityClientController.java
class ActivityClientController extends IActivityClientController.Stub {
    @Override
    public boolean finishActivity(IBinder token, int resultCode, Intent resultData,
            int finishTask) {
        ...

        final ActivityRecord r;
        synchronized (mGlobalLock) {
            r = ActivityRecord.isInRootTaskLocked(token);
            if (r == null) {
                return true;
            }
        }

        ...

        synchronized (mGlobalLock) {
            ...
            try {
                final boolean res;
                final boolean finishWithRootActivity =
                        finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
                if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
                        || (finishWithRootActivity && r == rootR)) {
                    mTaskSupervisor.removeTask(tr, false /*killProcess*/,
                            finishWithRootActivity, "finish-activity");
                    res = true;
                    r.mRelaunchReason = RELAUNCH_REASON_NONE;
                } else {
                    r.finishIfPossible(resultCode, resultData, resultGrants, "app-request",
                            true /* oomAdj */); // 1
                    res = r.finishing;
                    if (!res) {
                        Slog.i(TAG, "Failed to finish by app-request");
                    }
                }
                return res;
            } finally {
                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
                Binder.restoreCallingIdentity(origId);
            }
        }
    }
}
// frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
final ActivityTaskManagerService mAtmService;
@FinishRequest int finishIfPossible(int resultCode, Intent resultData,
        NeededUriGrants resultGrants, String reason, boolean oomAdj) {
   	...

    mAtmService.deferWindowLayout();
    try {
        ...

        finishActivityResults(resultCode, resultData, resultGrants); // 1

        final boolean endTask = task.getTopNonFinishingActivity() == null
                && !task.isClearingToReuseTask();
        mTransitionController.requestCloseTransitionIfNeeded(endTask ? task : this);
  			
  			...

        return FINISH_RESULT_REQUESTED;
    } finally {
        mAtmService.continueWindowLayout();
    }
}

private void finishActivityResults(int resultCode, Intent resultData,
        NeededUriGrants resultGrants) {
    if (resultTo != null) {
        ...
        if (mForceSendResultForMediaProjection || resultTo.isState(RESUMED)) {
            final ActivityRecord resultToActivity = resultTo; // 1
            mAtmService.mH.post(() -> {
                synchronized (mAtmService.mGlobalLock) {
                    resultToActivity.sendResult(this.getUid(), resultWho, requestCode,
                            resultCode, resultData, resultGrants,
                            mForceSendResultForMediaProjection); // 2
                }
            });
        } else {
            resultTo.addResultLocked(this, resultWho, requestCode, resultCode, resultData);
        }
        resultTo = null;
    } else if (DEBUG_RESULTS) {
        Slog.v(TAG_RESULTS, "No result destination from " + this);
    }

    ...
}
// frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java
final ActivityTaskManagerService mAtmService;

void sendResult(int callingUid, String resultWho, int requestCode, int resultCode,
        Intent data, NeededUriGrants dataGrants, boolean forceSendForMediaProjection) {
    ...

    if (forceSendForMediaProjection && attachedToProcess() && 
        		isState(STARTED, PAUSING, PAUSED, STOPPING, STOPPED)) {
        final ClientTransaction transaction = 
          ClientTransaction.obtain(app.getThread(), token);
      
        transaction.addCallback(ActivityResultItem.obtain(
                List.of(new ResultInfo(resultWho, requestCode, resultCode, data))));
        ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult();
        if (lifecycleItem != null) {
            transaction.setLifecycleStateRequest(lifecycleItem);
        } else {
            Slog.w(TAG, "Unable to get the lifecycle item for state " + mState
                    + " so couldn't immediately send result");
        }
        try {
            mAtmService.getLifecycleManager().scheduleTransaction(transaction); // 1
        } catch (RemoteException e) {
            Slog.w(TAG, "Exception thrown sending result to " + this, e);
        }
    }

    addResultLocked(null /* from */, resultWho, requestCode, resultCode, data);
}
// frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
ClientLifecycleManager getLifecycleManager() {
    return mLifecycleManager;
}
// frameworks/base/services/core/java/com/android/server/wm/ClientLifecycleManager.java
class ClientLifecycleManager {
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule(); // 1
        if (!(client instanceof Binder)) {
            transaction.recycle();
        }
    }
 
}
// frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
private IApplicationThread mClient;
public void schedule() throws RemoteException {
    mClient.scheduleTransaction(this);
}
// frameworks/base/core/java/android/app/ActivityThread.java
private class ApplicationThread extends IApplicationThread.Stub {
  @Override
  public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
      ActivityThread.this.scheduleTransaction(transaction);
  }
}
// frameworks/base/core/java/android/app/ClientTransactionHandler.java
public abstract class ClientTransactionHandler {

    // Schedule phase related logic and handlers.

    /** Prepare and schedule transaction for execution. */
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
}
// frameworks/base/core/java/android/app/ActivityThread.java
final H mH = new H();

private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);

private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
    ...
    Message msg = Message.obtain();
    msg.what = what;
    msg.obj = obj;
    msg.arg1 = arg1;
    msg.arg2 = arg2;
    if (async) {
        msg.setAsynchronous(true);
    }
    mH.sendMessage(msg); // 1
}


class H extends Handler {
  public void handleMessage(Message msg) {
    ...
    case EXECUTE_TRANSACTION:
        final ClientTransaction transaction = (ClientTransaction) msg.obj;
        mTransactionExecutor.execute(transaction); // 2
        if (isSystem()) {
            transaction.recycle();
        }
        break;
    ...
	}
}
// frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
public void execute(ClientTransaction transaction) {
    if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction");

    final IBinder token = transaction.getActivityToken();
    if (token != null) {
        final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed =
                mTransactionHandler.getActivitiesToBeDestroyed();
        final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token);
        if (destroyItem != null) {
            if (transaction.getLifecycleStateRequest() == destroyItem) {
                activitiesToBeDestroyed.remove(token);
            }
            if (mTransactionHandler.getActivityClient(token) == null) {
                Slog.w(TAG, tId(transaction) + "Skip pre-destroyed transaction:\n"
                        + transactionToString(transaction, mTransactionHandler));
                return;
            }
        }
    }

    if (DEBUG_RESOLVER) Slog.d(TAG, transactionToString(transaction, mTransactionHandler));

    executeCallbacks(transaction); // 1

    executeLifecycleState(transaction);
    mPendingActions.clear();
    if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");
}

/** Cycle through all states requested by callbacks and execute them at proper times. */
@VisibleForTesting
public void executeCallbacks(ClientTransaction transaction) {
    final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
    if (callbacks == null || callbacks.isEmpty()) {
        // No callbacks to execute, return early.
        return;
    }
    if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callbacks in transaction");

    final IBinder token = transaction.getActivityToken(); // 2
    ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

    final ActivityLifecycleItem finalStateRequest = transaction.getLifecycleStateRequest();
    final int finalState = finalStateRequest != null ? finalStateRequest.getTargetState()
            : UNDEFINED;
    final int lastCallbackRequestingState = lastCallbackRequestingState(transaction);

    final int size = callbacks.size();
    for (int i = 0; i < size; ++i) {
        final ClientTransactionItem item = callbacks.get(i);
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item);
        final int postExecutionState = item.getPostExecutionState();

        if (item.shouldHaveDefinedPreExecutionState()) {
            final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,
                    item.getPostExecutionState());
            if (closestPreExecutionState != UNDEFINED) {
                cycleToPath(r, closestPreExecutionState, transaction);
            }
        }

        item.execute(mTransactionHandler, token, mPendingActions); // 3
        item.postExecute(mTransactionHandler, token, mPendingActions);
        if (r == null) {
            // Launch activity request will create an activity record.
            r = mTransactionHandler.getActivityClient(token);
        }

        if (postExecutionState != UNDEFINED && r != null) {
            final boolean shouldExcludeLastTransition =
                    i == lastCallbackRequestingState && finalState == postExecutionState;
            cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
        }
    }
}
// frameworks/base/core/java/android/app/servertransaction/DestroyActivityItem.java
public class DestroyActivityItem extends ActivityLifecycleItem {
    @Override
    public void execute(ClientTransactionHandler client, ActivityClientRecord r,
        PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
        client.handleDestroyActivity(r, mFinished, mConfigChanges,
                false /* getNonConfigInstance */, "DestroyActivityItem");
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }
}

// frameworks/base/core/java/android/app/ClientTransactionHandler.java
public abstract class ClientTransactionHandler {
    /** Destroy the activity. */
    public abstract void handleDestroyActivity(@NonNull ActivityClientRecord r, 
        boolean finishing, int configChanges, boolean getNonConfigInstance, String reason);
}
// frameworks/base/core/java/android/app/ActivityThread.java
@Override
public void handleDestroyActivity(ActivityClientRecord r, boolean finishing, 
                                  int configChanges, boolean getNonConfigInstance, 
                                  String reason) {
    performDestroyActivity(r, finishing, configChanges, getNonConfigInstance, reason); // 1
    ...
}

/** Core implementation of activity destroy call. */
void performDestroyActivity(ActivityClientRecord r, boolean finishing,
        int configChanges, boolean getNonConfigInstance, String reason) {
    Class<? extends Activity> activityClass;
    if (localLOGV) Slog.v(TAG, "Performing finish of " + r);
    activityClass = r.activity.getClass();
    r.activity.mConfigChangeFlags |= configChanges;
    if (finishing) {
        r.activity.mFinished = true;
    }

    performPauseActivityIfNeeded(r, "destroy");

    if (!r.stopped) {
        callActivityOnStop(r, false /* saveState */, "destroy");
    }
    ...
    try {
        r.activity.mCalled = false;
        mInstrumentation.callActivityOnDestroy(r.activity); // 2
        ...
    } catch (SuperNotCalledException e) {
        throw e;
    } catch (Exception e) {
        ...
    }
    r.setState(ON_DESTROY);
    ...
}

// frameworks/base/core/java/android/app/Instrumentation.java
public void callActivityOnDestroy(Activity activity) {
    activity.performDestroy();
}
// frameworks/base/core/java/android/app/Activity.java
final void performDestroy() {
    ...
    dispatchActivityPreDestroyed();
    mDestroyed = true;
    mWindow.destroy();
    mFragments.dispatchDestroy();
    onDestroy(); // 1
    ...
    dispatchActivityPostDestroyed();
    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}

@CallSuper
protected void onDestroy() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
    mCalled = true;

    getAutofillClientController().onActivityDestroyed();

    // 2 dismiss any dialogs we are managing. 关闭所有被管理的 dialog
    if (mManagedDialogs != null) {
        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final ManagedDialog md = mManagedDialogs.valueAt(i);
            if (md.mDialog.isShowing()) {
                md.mDialog.dismiss();
            }
        }
        mManagedDialogs = null;
    }

    // 3 close any cursors we are managing. 关闭所有被管理的 Cursor
    synchronized (mManagedCursors) {
        int numCursors = mManagedCursors.size();
        for (int i = 0; i < numCursors; i++) {
            ManagedCursor c = mManagedCursors.get(i);
            if (c != null) {
                c.mCursor.close();
            }
        }
        mManagedCursors.clear();
    }

    // 4 Close any open search dialog 关闭系统搜索服务的弹窗
    if (mSearchManager != null) {
        mSearchManager.stopSearch();
    }

    if (mActionBar != null) {
        mActionBar.onDestroy();
    }

    // 5 发送 Destroyed 事件,执行所有注册的 ActivityLifecycleCallbacks 的 onActivityDestroyed 回调
    dispatchActivityDestroyed();
		// 内容捕获服务
    notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_STOP);

    if (mUiTranslationController != null) {
        mUiTranslationController.onActivityDestroyed();
    }
    if (mDefaultBackCallback != null) {
        getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(mDefaultBackCallback);
        mDefaultBackCallback = null;
    }
    if (mCallbacksController != null) {
        mCallbacksController.clearCallbacks();
    }
}

至此,Activity 整个销毁流程就结束了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: activityAndroid中的一个组件,用于构建用户界面和处理用户交互。其工作流程如下: 1. 创建activity:当用户启动应用程序或从其他activity转换到当前activity时,系统会创建一个新的activity实例。 2. 加载布局:activity创建后,系统会加载与之关联的布局文件,并将其显示在屏幕上。 3. 处理用户交互:用户与activity交互时,系统会调用相应的回调方法,例如onCreate、onStart、onResume等。 4. 处理生命周期:当用户离开当前activity或者屏幕被覆盖时,系统会调用相应的回调方法,例如onPause、onStop、onDestroy等。 5. 保存和恢复状态:当activity销毁并重新创建时,系统会保存和恢复其状态,以确保用户体验的连续性。 总之,activityAndroid应用程序中最重要的组件之一,负责处理用户界面和用户交互,同时也需要处理生命周期和状态保存等问题。 ### 回答2: activity工作流程是指在软件开发过程中,将一个复杂的业务流程拆分成一系列的简单的活动或任务,并通过定义这些活动之间的逻辑关系,实现任务的协作和执行。 首先,需要明确定义业务流程的目标和要求。然后,通过业务分析,将业务流程拆分成各个子任务或活动,并确定它们的执行顺序和依赖关系。 接下来,需要对每个活动进行详细设计和实现。这包括确定活动的输入和输出,定义活动所需的资源和工具,以及编写执行该活动的代码。 在实际执行过程中,根据活动之间的关系,可以采用串行、并行或条件分支的方式来组织活动的执行顺序。每个活动在执行时,需要根据预设条件进行判断,确定是否满足执行条件。如果满足条件,则执行该活动;如果不满足条件,则等待条件满足后再执行。 在活动执行过程中,还需要及时记录活动的执行结果和状态,并根据需要进行相应的处理。如果某个活动执行失败,可以根据事先定义的异常处理策略,进行异常处理,并进行相应的后续操作。 最后,根据整个业务流程的执行结果,进行相应的汇总和统计,并输出相应的报告或结果。 总结来说,activity工作流程是通过将复杂的业务流程拆分成若干个简单的活动,并通过定义它们之间的逻辑关系和执行顺序,实现业务流程的自动化执行和协作。它可以提高工作效率,减少人为操作的错误,并方便对业务流程进行管理和监控。 ### 回答3: Activity工作流程是一种流行的、灵活的工作流程管理框架。它适用于各种类型的应用程序,包括企业、电子商务和科学应用。下面是Activity工作流程的详细解释。 Activity工作流程由一系列活动(Activity)组成,这些活动表示可以在应用程序中执行的任务或操作。每个活动都有一个特定的目标,并且通常是按照特定的顺序进行的。 工作流程开始于一个起始活动(Start Activity),表示工作流程的起点。然后,根据定义的规则和条件,系统将根据不同的条件选择执行不同的活动。 在Activity工作流程中,活动可以是串行的(Sequential),也可以是并行的(Parallel)。串行活动按顺序执行,而并行活动可以同时执行。这使得Activity工作流程非常灵活,可以适应各种业务场景的需求。 每个活动都可以定义输入和输出数据,以及执行的规则和条件。这些规则和条件可用于控制工作流程的流转,并在需要时触发特定的行为或决策。 在Activity工作流程中,活动之间可以有依赖关系,也可以有分支和合并。这些依赖关系和控制结构可以用来管理工作流程的执行顺序和条件。例如,如果某个活动的执行条件不满足,工作流程可以跳过该活动并继续执行其他活动。 工作流程的最后一个活动通常是结束活动(End Activity),表示工作流程的终点。当活动执行到结束活动时,工作流程就完成了。 总的来说,Activity工作流程是一种灵活而强大的工作流程管理框架,可以在各种场景中使用。它的特点包括定义明确的活动、支持串行和并行执行、具有条件和规则控制等。通过使用Activity工作流程,可以更加有效地管理和执行复杂的业务流程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值