Activity 的工作过程

下图是 Activity 的启动流程时序图,调用过程比较复杂,图片建议放大后查看。

Activity启动流程时序图

Android 9 及其以后 Activity 的启动过程有变化,主要体现在 realStartActivityLocked 方法。将启动一个 Activity 看做是执行一次事务。当调用 startActivity 那一刻开始,就进行了很深层次的方法调用,不过最终调用还是会回到 ActivityThread,H 是 ActivityThread 的一个内部类,它继承了 Handler,启动一个 Activity 就是用 H 发送了一个 EXECUTE_TRANSACTION 类型的消息。H 对象接收到了这个消息就会调用 handleMessage 方法对这个消息进行相应的处理,如下部分源码是对一些消息的处理。

public void handleMessage(Message msg) {
    if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
    switch (msg.what) {
        case RECEIVER:
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
            handleReceiver((ReceiverData)msg.obj);
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            break;
        case CREATE_SERVICE:
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));
            handleCreateService((CreateServiceData)msg.obj);
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            break;
        case BIND_SERVICE:
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
            handleBindService((BindServiceData)msg.obj);
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            break;
        case UNBIND_SERVICE:
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");
            handleUnbindService((BindServiceData)msg.obj);
            schedulePurgeIdler();
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            break;
        case EXECUTE_TRANSACTION:
            final ClientTransaction transaction = (ClientTransaction) msg.obj;
            mTransactionExecutor.execute(transaction);
            if (isSystem()) {
                // Client transactions inside system process are recycled on the client side
                // instead of ClientLifecycleManager to avoid being cleared before this
                // message is handled.
                transaction.recycle();
            }
            // TODO(lifecycler): Recycle locally scheduled transactions.
            break;
        case RELAUNCH_ACTIVITY:
            handleRelaunchActivityLocally((IBinder) msg.obj);
            break;
    }
}

我们知道启动一个 Activity 就是发送一个 EXECUTE_TRANSACTION 类型的消息,然后由 Handler 来处理。最终的调用是 ClientTransactionItem 各个子类的 execute 方法。比如启动一个 Activity ,那么就是 LaunchActivityItem 中的 execute 方法。

@Override
public void execute(ClientTransactionHandler client, IBinder token,
        PendingTransactionActions pendingActions) {
    Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
            mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
            mPendingResults, mPendingNewIntents, mIsForward,
            mProfilerInfo, client, mAssistToken);
    client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
    Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}

看到 client.handleLaunchActivity 就知道再次绕回到 ActivityThread#handleLaunchActivity 方法中去了。

@Override
public Activity handleLaunchActivity(ActivityClientRecord r,
        PendingTransactionActions pendingActions, Intent customIntent) {
    WindowManagerGlobal.initialize();

    // Hint the GraphicsEnvironment that an activity is launching on the process.
    GraphicsEnvironment.hintActivityLaunch();

    final Activity a = performLaunchActivity(r, customIntent);
    return a;
}

handleLaunchActivity 中又调用了 performLaunchActivity。这个方法是启动 Activity 的真正实现,内部实例化了 Activity 对象、ContextImpl 上下文对象、Application 对象,然后依次调用了 Activity 的 attach 和 onCreate 方法,这意味着 Activity 完成了整个启动过程。

/**  Core implementation of activity launch. */
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ActivityInfo aInfo = r.activityInfo;
    // 实例化上下文对象
    ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = appContext.getClassLoader();
        // 实例化 activity
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        StrictMode.incrementExpectedActivityCount(activity.getClass());
        r.intent.setExtrasClassLoader(cl);
        r.intent.prepareToEnterProcess();
        if (r.state != null) {
            r.state.setClassLoader(cl);
        }
    }

    try {
        // 实例化 Application 对象,该对象在整个应用程序中只有一个,如果已经创建过,则不会再次创建
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        if (activity != null) {
            // 调用 activity 的 attach 的方法,建立 activity 与 ContextImpl 的关联。除此之外,在 attach 还会完成 Window 的创建
            //并建立自己和 Window 的关联,这样当 Window 接收到外部输入事件后就可以将事件传递给 Activity。
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.referrer, r.voiceInteractor, window, r.configCallback,
                    r.assistToken);
            activity.mCalled = false;
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {//调用 Activity 的 onCreate 方法
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            r.activity = activity;
        }
        r.setState(ON_CREATE);
    }
    return activity;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: activity是Android中的一个组件,用于构建用户界面和处理用户交互。其工作流程如下: 1. 创建activity:当用户启动应用程序或从其他activity转换到当前activity时,系统会创建一个新的activity实例。 2. 加载布局:activity创建后,系统会加载与之关联的布局文件,并将其显示在屏幕上。 3. 处理用户交互:用户与activity交互时,系统会调用相应的回调方法,例如onCreate、onStart、onResume等。 4. 处理生命周期:当用户离开当前activity或者屏幕被覆盖时,系统会调用相应的回调方法,例如onPause、onStop、onDestroy等。 5. 保存和恢复状态:当activity被销毁并重新创建时,系统会保存和恢复其状态,以确保用户体验的连续性。 总之,activity是Android应用程序中最重要的组件之一,负责处理用户界面和用户交互,同时也需要处理生命周期和状态保存等问题。 ### 回答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、付费专栏及课程。

余额充值