返回

Android Activity 启动流程源码深度解析

Android

前言

作为 Android 开发者,了解 Activity 启动流程至关重要,因为它直接影响应用程序的启动速度和用户体验。本文将带领您深入 Android Activity 启动的源码,从头到尾解析其工作机制。

ActivityManager 的作用

Activity 启动的核心是 ActivityManager 服务。它负责管理应用程序生命周期和 Activity 状态转换。Activity 启动时,系统通过 ActivityManager.getService() 来获取 IActivityManager 接口,用于与系统服务进行通信。

启动流程分解

Activity 启动流程大致可分为以下步骤:

  1. Intent 分发: 系统收到一个 Intent,用于启动一个新的 Activity。
  2. Activity 创建: 系统根据 Intent 信息创建新的 Activity 实例。
  3. Attaching to Application: Activity 被附加到其应用程序对象,并创建其 View 层次结构。
  4. onResume() 调用: Activity 的 onResume() 方法被调用,标志着 Activity 已准备好与用户交互。

源码解析

让我们深入源码分析这些步骤:

1. Intent 分发

public static void startActivity(Context context, Intent intent) {
    String resolvedType = intent.resolveTypeIfNeeded(context.getContentResolver());
    String scheme = intent.getScheme();
    boolean isCrossScheme = "http".equals(scheme) || "https".equals(scheme);

    try {
        startActivityAsUser(context, intent, resolvedType, isCrossScheme, UserHandle.CURRENT_OR_SELF);
    } catch (ActivityNotFoundException ex) {
        throw ex;
    }
}

startActivity() 方法在 Context 类中定义。它负责将 Intent 发送给 ActivityManager 服务。

2. Activity 创建

public final void startActivity(Intent intent, ActivityInfo activityInfo) {
    try {
        mService.startActivity(mToken, null, intent, activityInfo, null, null, 0, 0, null, null, null);
    } catch (RemoteException ex) {
        throw ex.rethrowAsRuntimeException();
    }
}

ActivityManager.startActivity() 方法被调用,创建新的 Activity 实例。

3. Attaching to Application

protected void attach(Context context, ActivityThread aThread, Instrumentation instrumentation, IBinder token, int ident, Application application, Intent intent, ActivityInfo info,
                    CompatibilityInfo compatInfo, Configuration config, Activity.NonConfigurationInstances lastNonConfigurationInstances,
                    Bundle activityState, Bundle lastActivityState, boolean inMultiWindowMode) {
    // ...

    if (lastActivityState != null) {
        activity.onRestoreInstanceState(lastActivityState);
    }

    if (!mCalled) {
        activity.performCreate(lastNonConfigurationInstances, intent);
        mCalled = true;
    }
}

Activity.attach() 方法将 Activity 附加到其应用程序对象,并创建其 View 层次结构。

4. onResume() 调用

public void onResume() {
    super.onResume();

    mCurrentFocus = null;
    mResumed = true;
    mStopped = false;
    if (!mCalled) {
        onStart();
        mCalled = true;
    }
    if (!mCreated) {
        mResumed = false;
        mStopped = false;
        mFinished = true;
        finish();
        return;
    }

    mCalled = false;
}

Activity.onResume() 方法被调用,标志着 Activity 已准备就绪与用户交互。

优化技巧

为了优化 Activity 启动,请考虑以下技巧:

  • 避免阻塞操作: 启动 Activity 时,尽量避免执行耗时的操作,如网络请求或数据库查询。
  • 使用启动加载器: 使用 Activity 启动加载器可以在 Activity 创建之前加载资源,从而提高启动速度。
  • 缩小 View 层次结构: 复杂的 View 层次结构会影响启动时间,因此请优化布局以尽量减少 View 的数量和层级深度。

结论

通过深入分析 Android Activity 启动的源码,我们获得了对背后机制的深刻理解。掌握这些底层知识可以帮助我们优化应用程序的启动性能,为用户提供更流畅的体验。