前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Activity启动过程分析

Activity启动过程分析

原创
作者头像
ruochen
修改2021-11-24 13:45:21
9550
修改2021-11-24 13:45:21
举报
文章被收录于专栏:若尘的技术专栏

一、Activity启动前的进程关系

  • init进程:init是所有linux程序的起点,是Zygote的父进程。解析init.rc孵化出Zygote进程。
  • Zygote进程:Zygote是所有Java进程的父进程,所有的App进程都是由Zygote进程fork生成的。
  • SystemServer进程:System Server是Zygote孵化的第一个进程。SystemServer负责启动和管理整个Java framework,包含AMS,PMS等服务。
  • Launcher:Zygote进程孵化的第一个App进程是Launcher

1.1、什么是init进程

Android是基于linux系统的,手机开机之后,linux内核进行加载。加载完成之后会启动init进程。

init进程会启动ServiceManager,孵化一些守护进程,并解析init.rc孵化Zygote进程。

1.2、Zygote进程

所有的App进程都是由Zygote进程fork生成的,包括SystemServer进程。

Zygote初始化后,会注册一个等待接受消息的socket,OS层会采用socket进行IPC通信。

1.3、为什么是Zygote来孵化进程,而不是新建进程呢?

每个应用程序都是运行在各自的Dalvik虚拟机中,应用程序每次运行都要重新初始化和启动虚拟机,这个过程会耗费很长时间。Zygote会把已经运行的虚拟机的代码和内存信息共享。起到一个预加载资源和类的作用,从而缩短启动时间。

二、Activity启动涉及到的一些类:

2.1、ActivityRecord

ActivityRecord是Activity在system_server进程中的镜像,Activity实例与ActivityRecord实例一一对应。ActivityRecord用来存储Activity的信息,如所在的进程名称,应用的包名,所在的任务栈的taskAffinity等。

代码语言:txt
复制
/**
代码语言:txt
复制
 * An entry in the history stack, representing an activity.
 */
final class ActivityRecord {
    final ComponentName realActivity;  // the intent component, or target of an alias.
    final String shortComponentName; // the short component name of the intent
    final String packageName; // the package implementing intent's component
    final String processName; // process where this component wants to run
    final String taskAffinity; // as per ActivityInfo.taskAffinity
    boolean fullscreen; // covers the full screen?
}

2.2、TaskRecord

TaskRecord表示任务栈,是真正的一个先进后出的栈结构,用于记录activity开启的先后顺序。其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。有了TaskRecord,Android系统才能知道当一个Activity退出时,接下来该显示哪一个Activity。

代码语言:txt
复制
final class TaskRecord {
代码语言:txt
复制
    /** List of all activities in the task arranged in history order */
代码语言:txt
复制
    final ArrayList<ActivityRecord> mActivities;
代码语言:txt
复制
}

2.3、ActivityStack

ActivityStack 是TaskRecord的一个分组,用于管理TaskRecord列表,列表中的TaskRecord可以重排顺序。

代码语言:txt
复制
final class ActivityStack {
代码语言:txt
复制
    /**
代码语言:txt
复制
     * The back history of all previous (and possibly still
     * running) activities.  It contains #TaskRecord objects.
     */
    private ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
}
2.3.1 TaskRecord、ActivityStack关系。
代码语言:txt
复制
通常情况下,一个App对应一个ActivityStack,ActivityStatck中会有一个TaskRecord列表,通常列表中仅有一个TaskRecord,维护Activity栈。

image

代码语言:txt
复制
一个Activity启动时,归属的TaskRecord,通常是启动它的Activity 对应的TaskRecord。
代码语言:txt
复制
如ActivtiyA启动ActivityB,那么ActivityB会被保存在ActivityA所属的TaskRecord中。

image

代码语言:txt
复制
当一个Activity的launchmode 设置了SingleIntance,那么它启动的时候就会新建一个TaskRecord,这时ActvityStack中就会存在多个TaskRecord 栈结构。

image

当设置了Intent.FLAG_ACTIVITY_NEW_TASK和taskAffinity时,可能会出现多个app共享同一个ActivityStack的情况。

代码语言:txt
复制
taskAffinity 可以指定Activity需要宿主TaskRecord的名字,当ActivityManagerService发现启动了一个带有 FLAG_ACTIVITY_NEW_TASK 标签的 Activity 时,会先去查找当前AMS中是否存在activity需要的ActivityStack和TaskRecord,如果存在则直接将ActivityRecord添加到对应ActivityStack的TaskRecord中去,否则会先新建一个TaskRecord,然后将ActvityRecord添加到新建的TaskRecord中。

adb shell dumpsys activity 查看activity栈的请款

代码语言:txt
复制
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
代码语言:txt
复制
Display #0 (activities from top to bottom):
代码语言:txt
复制
  Stack #1:
代码语言:txt
复制
      TaskRecord{4212758 #173 A=com.sogou.iot.testtouch1 U=0 StackId=1 sz=2}
代码语言:txt
复制
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.sogou.iot.testtouch1/.MainActivity }
代码语言:txt
复制
        Hist #1: ActivityRecord{4c91dda u0 com.sogou.iot.testtouch1/.SecondActivity t173}
代码语言:txt
复制
          Intent { cmp=com.sogou.iot.testtouch1/.SecondActivity }
代码语言:txt
复制
          ProcessRecord{3fd8bbc 23189:com.sogou.iot.testtouch1/u0a79}
代码语言:txt
复制
        Hist #0: ActivityRecord{93a3d53 u0 com.sogou.iot.testtouch1/.MainActivity t173}
代码语言:txt
复制
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.sogou.iot.testtouch1/.MainActivity bnds=[433,77][644,372] }
代码语言:txt
复制
          ProcessRecord{3fd8bbc 23189:com.sogou.iot.testtouch1/u0a79}
代码语言:txt
复制
    Running activities (most recent first):
代码语言:txt
复制
      TaskRecord{4212758 #173 A=com.sogou.iot.testtouch1 U=0 StackId=1 sz=2}
代码语言:txt
复制
        Run #1: ActivityRecord{4c91dda u0 com.sogou.iot.testtouch1/.SecondActivity t173}
代码语言:txt
复制
        Run #0: ActivityRecord{93a3d53 u0 com.sogou.iot.testtouch1/.MainActivity t173}
代码语言:txt
复制
    mResumedActivity: ActivityRecord{4c91dda u0 com.sogou.iot.testtouch1/.SecondActivity t173}
代码语言:txt
复制
  Stack #0:
代码语言:txt
复制
      TaskRecord{db2272c #1 A=com.huawei.android.launcher U=0 StackId=0 sz=1}
代码语言:txt
复制
      Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000300 cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher }
代码语言:txt
复制
        Hist #0: ActivityRecord{60dec4e u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}
代码语言:txt
复制
          Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000300 cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher }
代码语言:txt
复制
          ProcessRecord{c03fa2 1781:com.huawei.android.launcher/u0a50}
代码语言:txt
复制
    Running activities (most recent first):
代码语言:txt
复制
      TaskRecord{db2272c #1 A=com.huawei.android.launcher U=0 StackId=0 sz=1}
代码语言:txt
复制
        Run #0: ActivityRecord{60dec4e u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}

Stack #0: 代表一个ActivityStack, id = 0 说明是Launcher相关的ActivitStack。

Stack #1: ActivityStack id = 1

,代表常规App的ActvityStack,其中存在一个TaskRecord栈,栈中有两个ActivityRecord

(MainActivity和SecondActivity),SecondeActivity在栈顶,处于Resume状态

2.4、ActivityStackSupervisor

ActivityStackSupervisor是ActivityStack的管理者。

内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个ActivityStack。

其中,mHomeStack管理的是Launcher相关的Activity栈,stackId为0;

mFocusedStack管理的是当前显示在前台Activity的Activity栈;

mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。

image

ActivityDisplay表示一个屏幕,Android支持三种屏幕:主屏幕,外接屏幕(HDMI等),虚拟屏幕(投屏)。一般情况下,即只有主屏幕时,ActivityStackSupervisor与ActivityDisplay都是系统唯一;

ActivityDisplay是ActivityStackSupervisor的内部类,它相当于一个工具类,封装了移除和添加ActivityStack的方法。

2.5 ActivityThread:

ActivityThread 运行在UI线程(主线程),App的真正入口。

2.6 ApplicationThread

ApplicationThread是一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的IPC消息,继而做相应处理。

代码语言:txt
复制
 private class ApplicationThread extends IApplicationThread.Stub{
代码语言:txt
复制
 }

2.7 IActivityManager

继承与IInterface接口,用于app进程向ActivityManagerService 单向IPC通信

2.8、Instrumentation

仪表盘,负责调用Activity和Application生命周期,测试用到这个类比较多。

三、具体的启动过程

3.1、流程概述

  1. Launcher:Launcher通知AMS要启动activity
  • startActivitySafely->startActivity->Instrumentation.execStartActivity()(AMP.startActivity)->AMS.startActivity
  1. ActivitMapagerService:PackageManagerService的resoveIntent验证要启动activity是否匹配。
  • 如果匹配,通过ApplicationThread发消息给Launcher所在的主线程,暂停当前Activity(Launcher);
  • 暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?
  • * 存在:发送消息LAUNCH_ACTIVITY给需要启动的Activity主线程,执行handleLaunchActivity
  • * 不存在:通过socket向zygote请求创建进程。进程启动后,ActivityThread.attach
  1. 判断Application是否存在,若不存在,通过LoadApk.makeApplication创建一个。在主线程中通过thread.attach方法来关联ApplicationThread。
  2. 在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。
  3. 继续通过ApplicationThread来发送消息给主线程的Handler来启动Activity(handleLaunchActivity)
  4. handleLauchActivity:调用了performLauchActivity,里边Instrumentation生成了新的activity对象,继续调用activity生命周期。

3.2、流程跟踪

阶段一:Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)
  • Activity.startActivity
  • Activity.startActivityForResult
  • Instrumentation.execStartActivity //交由Instrumentation代为发起请求
  • ActivityManager.getService().startActivity //通过IActivityManagerSingleton.get()得到一个AMP代理对象
  • ActivityManagerService.startActivity()
阶段二:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后AMS会通知Launcher程序pause

Activity(在AMS所在进程执行)

  • ActivityManagerService.startActivity
  • ActivityManagerService.startActivityAsUser
  • ActivityStackSupervisor.startActivityMayWait
  • ActivityStarter.startActivityUnchecked
  • ActivityStarter.startActivity
  • ActivityStarter.startActivityUnchecked
  • ActivityStack.startActivityLocked
  • ActivityStackSupervisor.resumeFocusedStackTopActivityLocked
  • ActivityStack.resumeTopActivityUncheckedLocked
  • ActivityStack.resumeTopActivityInnerLocked
代码语言:txt
复制
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options){
代码语言:txt
复制
     if (mResumedActivity != null) {
代码语言:txt
复制
            if (DEBUG_STATES) Slog.d(TAG_STATES,
代码语言:txt
复制
                    "resumeTopActivityLocked: Pausing " + mResumedActivity);
代码语言:txt
复制
            pausing |= startPausingLocked(userLeaving, false, next, false);
代码语言:txt
复制
        }
代码语言:txt
复制
}
  • ActivityStack.startPausingLocked
代码语言:txt
复制
 if (prev.app != null && prev.app.thread != null) {
代码语言:txt
复制
    mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
代码语言:txt
复制
    PauseActivityItem.obtain(prev.finishing, userLeaving,
代码语言:txt
复制
                                prev.configChangeFlags, pauseImmediately)
代码语言:txt
复制
                                );
代码语言:txt
复制
}

PauseActivityItem 为暂停Activity的一个ClientTransactionItem

事务,AMS对Activity的操作都封装成了事务来完成。

代码语言:txt
复制
public class PauseActivityItem extends ActivityLifecycleItem {
代码语言:txt
复制
    private static final String TAG = "PauseActivityItem";
代码语言:txt
复制
    private boolean mFinished;
代码语言:txt
复制
    private boolean mUserLeaving;
代码语言:txt
复制
    private int mConfigChanges;
代码语言:txt
复制
    private boolean mDontReport;
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public void execute(ClientTransactionHandler client, IBinder token,
代码语言:txt
复制
        client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions,
代码语言:txt
复制
                "PAUSE_ACTIVITY_ITEM");
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public abstract class ActivityLifecycleItem extends ClientTransactionItem {
代码语言:txt
复制
    @Retention(RetentionPolicy.SOURCE)
代码语言:txt
复制
    public @interface LifecycleState{}
代码语言:txt
复制
    public static final int UNDEFINED = -1;
代码语言:txt
复制
    public static final int PRE_ON_CREATE = 0;
代码语言:txt
复制
    public static final int ON_CREATE = 1;
代码语言:txt
复制
    public static final int ON_START = 2;
代码语言:txt
复制
    public static final int ON_RESUME = 3;
代码语言:txt
复制
    public static final int ON_PAUSE = 4;
代码语言:txt
复制
    public static final int ON_STOP = 5;
代码语言:txt
复制
    public static final int ON_DESTROY = 6;
代码语言:txt
复制
    public static final int ON_RESTART = 7;
代码语言:txt
复制
}
代码语言:txt
复制
public class ClientTransaction implements Parcelable, ObjectPoolItem {
代码语言:txt
复制
       /** Target client. */
代码语言:txt
复制
    private IApplicationThread mClient;
代码语言:txt
复制
}
代码语言:txt
复制
 public void schedule() throws RemoteException {
代码语言:txt
复制
        mClient.scheduleTransaction(this);
代码语言:txt
复制
    }

mService.getLifecycleManager().scheduleTransaction,最终调用了IApplciationThread.scheduleTransaction()

此时完成 ActivityManagerService->ApplicationThread发消息,暂停Activity的过程。

阶段三: pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)

上文知ActivityManagerService向ApplicationThread发送了一个PauseActivity的Transaction事务,相应的调用

  • ApplicationThread.scheduleTransaction()
  • ActivityThread.scheduleTransaction()
  • ActivityThread 发送H.EXECUTE_TRANSACTION
  • ActivityThread.H.handleMessage
  • ActivityThread.handlePauseActivity
  • IActivityManager.activityPaused

ApplicationThread的scheduleTransaction()方法,最终调用了ActivityThread的父类ClientTransactionHandler中的方法,发送了一个H.EXECUTE_TRANSACTION消息到主线程Handler

代码语言:txt
复制
public abstract class ClientTransactionHandler {
代码语言:txt
复制
    // Schedule phase related logic and handlers.
代码语言:txt
复制
    /** Prepare and schedule transaction for execution. */
代码语言:txt
复制
    void scheduleTransaction(ClientTransaction transaction) {
代码语言:txt
复制
        transaction.preExecute(this);
代码语言:txt
复制
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
代码语言:txt
复制
    }

handleMessage 处理EXECUTE_TRANSACTION消息时 会调用TransactionExecutor.execuate()

代码语言:txt
复制
 public void handleMessage(Message msg) {
代码语言:txt
复制
  case EXECUTE_TRANSACTION:
代码语言:txt
复制
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
代码语言:txt
复制
                    mTransactionExecutor.execute(transaction);
代码语言:txt
复制
                    break;
代码语言:txt
复制
    }
代码语言:txt
复制
    public class TransactionExecutor {
代码语言:txt
复制
     public void execute(ClientTransaction transaction) {
代码语言:txt
复制
            executeCallbacks(transaction);
代码语言:txt
复制
            executeLifecycleState(transaction);
代码语言:txt
复制
        }
代码语言:txt
复制
    private void executeLifecycleState(ClientTransaction transaction) {
代码语言:txt
复制
        final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
代码语言:txt
复制
        lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
代码语言:txt
复制
        lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
代码语言:txt
复制
    }
代码语言:txt
复制
}

最终会调用ActivityThread的handlePauseActivity()方法

阶段四:检查activity所在进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Process.start创建一个新进程(执行在AMS进程)

  • ActivityManagerService.activityPaused
代码语言:txt
复制
 @Override
代码语言:txt
复制
    public final void activityPaused(IBinder token) {
代码语言:txt
复制
        final long origId = Binder.clearCallingIdentity();
代码语言:txt
复制
        synchronized(this) {
代码语言:txt
复制
            ActivityStack stack = ActivityRecord.getStackLocked(token);
代码语言:txt
复制
            if (stack != null) {
代码语言:txt
复制
                stack.activityPausedLocked(token, false);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        Binder.restoreCallingIdentity(origId);
代码语言:txt
复制
    }
  • ActivityStack.activityPausedLocked
代码语言:txt
复制
 final void activityPausedLocked(IBinder token, boolean timeout) {
代码语言:txt
复制
   completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
代码语言:txt
复制
 }
  • ActivityStack.completePauseLocked
  • ActivityStackSupervisor.resumeFocusedStackTopActivityLocked
  • ActivityStack.resumeTopActivityUncheckedLocked
  • ActivityStack.resumeTopActivityInnerLocked
  • ActivityStack.startSpecificActivityLocked
  • ActivityStack.startSpecificActivityLocked

经过一系列调用,最终代码又回到了 ActivityStackSupervisor 中的 startSpecificActivityLocked 方法。

代码语言:txt
复制
void startSpecificActivityLocked(ActivityRecord r,
代码语言:txt
复制
        boolean andResume, boolean checkConfig) {
代码语言:txt
复制
     //注释一:根据进程名和uuid判断Activity所属的进程是否创建   
代码语言:txt
复制
    // Is this activity's application already running?
代码语言:txt
复制
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
代码语言:txt
复制
            r.info.applicationInfo.uid, true);
代码语言:txt
复制
    if (app != null && app.thread != null) {
代码语言:txt
复制
        try {
代码语言:txt
复制
            if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
代码语言:txt
复制
                    || !"android".equals(r.info.packageName)) {
代码语言:txt
复制
                // Don't add this if it is a platform component that is marked
代码语言:txt
复制
                // to run in multiple processes, because this is actually
代码语言:txt
复制
                // part of the framework so doesn't make sense to track as a
代码语言:txt
复制
                // separate apk in the process.
代码语言:txt
复制
                app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,
代码语言:txt
复制
                        mService.mProcessStats);
代码语言:txt
复制
            }
代码语言:txt
复制
            //注释二
代码语言:txt
复制
            realStartActivityLocked(r, app, andResume, checkConfig);
代码语言:txt
复制
            return;
代码语言:txt
复制
        } catch (RemoteException e) {
代码语言:txt
复制
            Slog.w(TAG, "Exception when starting activity "
代码语言:txt
复制
                    + r.intent.getComponent().flattenToShortString(), e);
代码语言:txt
复制
        }
代码语言:txt
复制
        // If a dead object exception was thrown -- fall through to
代码语言:txt
复制
        // restart the application.
代码语言:txt
复制
    }
代码语言:txt
复制
    //注释三 调用ActivityManagerService 启动activity所在进程
代码语言:txt
复制
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
代码语言:txt
复制
            "activity", r.intent.getComponent(), false, false, true);
代码语言:txt
复制
}
  • 注释一 根据进程名和 Application 的 uid,来判断目标进程是否已经创建,如果没有则代表进程未创建。
  • 注释二 如果acitivity所在的进程已经存在,则尝试启动Activity
  • 注释三 如果activity所在的进程不存在,则尝试调用ActivityManagerService来启动进程。

首次启动App,app进程为空,会尝试创建app进程,不会执行realStartActivityLocked

  • ActivityManagerService.startProcessLocked
  • Process.start //在这里创建了新进程,新的进程会导入ActivityThread类,并执行它的main函数

阶段五:进程创建后,执行ActivityThread.main()入口函数,

创建ActivityThread实例,执行ActivityThread.attach(),创建Application。IPC向ActivityManagerService发送

attachApplication消息,之后进入Loop循环。(执行在新创建的app进程)

  • ActivityThread.main
  • ActivityThread.attach(false) //声明不是系统进程
  • ActivityManagerProxy.attachApplication

阶段六:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)

  • ActivityManagerService.attachApplication //AMS绑定本地ApplicationThread对象,后续通过ApplicationThread(Binder)对象进行通信
  • ActivityManagerService.attachApplicationLocked
代码语言:txt
复制
  private final boolean attachApplicationLocked(IApplicationThread thread,
代码语言:txt
复制
            int pid, int callingUid, long startSeq) {
代码语言:txt
复制
                  // See if the top visible activity is waiting to run in this process...
代码语言:txt
复制
        if (normalMode) {
代码语言:txt
复制
            try {
代码语言:txt
复制
                if (mStackSupervisor.attachApplicationLocked(app)) {
代码语言:txt
复制
                    didSomething = true;
代码语言:txt
复制
                }
代码语言:txt
复制
            } catch (Exception e) {
代码语言:txt
复制
                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
代码语言:txt
复制
                badApp = true;
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
}
  • ActivityStackSupervisor.attachApplicationLocked
代码语言:txt
复制
boolean attachApplicationLocked(ProcessRecord app){
代码语言:txt
复制
   realStartActivityLocked(activity, app,top == activity /* andResume */, true /* checkConfig */)) {
代码语言:txt
复制
}
  • ActivityStackSupervisor.realStartActivityLocked //真正要启动Activity了!
代码语言:txt
复制
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
代码语言:txt
复制
            boolean andResume, boolean checkConfig) throws RemoteException {
代码语言:txt
复制
                // Create activity launch transaction.
代码语言:txt
复制
                final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
代码语言:txt
复制
                        r.appToken);
代码语言:txt
复制
                clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
代码语言:txt
复制
                        System.identityHashCode(r), r.info,
代码语言:txt
复制
                        // TODO: Have this take the merged configuration instead of separate global
代码语言:txt
复制
                        // and override configs.
代码语言:txt
复制
                        mergedConfiguration.getGlobalConfiguration(),
代码语言:txt
复制
                        mergedConfiguration.getOverrideConfiguration(), r.compat,
代码语言:txt
复制
                        r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
代码语言:txt
复制
                        r.persistentState, results, newIntents, mService.isNextTransitionForward(),
代码语言:txt
复制
                        profilerInfo));
代码语言:txt
复制
                // Set desired final state.
代码语言:txt
复制
                final ActivityLifecycleItem lifecycleItem;
代码语言:txt
复制
                if (andResume) {
代码语言:txt
复制
                    lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
代码语言:txt
复制
                } else {
代码语言:txt
复制
                    lifecycleItem = PauseActivityItem.obtain();
代码语言:txt
复制
                }
代码语言:txt
复制
                clientTransaction.setLifecycleStateRequest(lifecycleItem);
代码语言:txt
复制
                // Schedule transaction.
代码语言:txt
复制
                mService.getLifecycleManager().scheduleTransaction(clientTransaction);
代码语言:txt
复制
            }

realStartActivityLocked 创建了一个LaunchActivityItem的事务,通过ApplicationThread

IPC发送给了新创建的app进程。

  • ActivityThread.handleLaunchActivity
  • ActivityThread.performLaunchActivity
代码语言:txt
复制
 /**  Core implementation of activity launch. */
代码语言:txt
复制
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
代码语言:txt
复制
    ActivityInfo aInfo = r.activityInfo;
代码语言:txt
复制
    //(1)为Activity创建Context
代码语言:txt
复制
    ContextImpl appContext = createBaseContextForActivity(r);
代码语言:txt
复制
    Activity activity = null;
代码语言:txt
复制
    //(2) 通过Instrumentation 创建Activity实例
代码语言:txt
复制
    activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);
代码语言:txt
复制
        //获取Applciation实例 
代码语言:txt
复制
    Application app = r.packageInfo.makeApplication(false, mInstrumentation);
代码语言:txt
复制
    if (activity != null) {
代码语言:txt
复制
        //(3)调用activity.attach()
代码语言:txt
复制
        activity.attach(appContext, this, getInstrumentation(), r.token,
代码语言:txt
复制
                r.ident, app, r.intent, r.activityInfo, title, r.parent,
代码语言:txt
复制
                r.embeddedID, r.lastNonConfigurationInstances, config,
代码语言:txt
复制
                r.referrer, r.voiceInteractor, window, r.configCallback);
代码语言:txt
复制
        if (customIntent != null) {
代码语言:txt
复制
            activity.mIntent = customIntent;
代码语言:txt
复制
        }
代码语言:txt
复制
        int theme = r.activityInfo.getThemeResource();
代码语言:txt
复制
        if (theme != 0) {
代码语言:txt
复制
            activity.setTheme(theme);
代码语言:txt
复制
        }
代码语言:txt
复制
        //(4) 调用Instrumentation.callActivityOnCreate() 触发Activity生命周期
代码语言:txt
复制
        if (r.isPersistable()) {
代码语言:txt
复制
            mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
代码语言:txt
复制
        } else {
代码语言:txt
复制
            mInstrumentation.callActivityOnCreate(activity, r.state);
代码语言:txt
复制
        }
代码语言:txt
复制
    return activity;
代码语言:txt
复制
}

至此Activity已经被启动起来了

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Activity启动前的进程关系
    • 1.1、什么是init进程
      • 1.2、Zygote进程
        • 1.3、为什么是Zygote来孵化进程,而不是新建进程呢?
        • 二、Activity启动涉及到的一些类:
          • 2.1、ActivityRecord
            • 2.2、TaskRecord
              • 2.3、ActivityStack
                • 2.3.1 TaskRecord、ActivityStack关系。
              • 2.4、ActivityStackSupervisor
                • 2.5 ActivityThread:
                  • 2.6 ApplicationThread
                    • 2.7 IActivityManager
                      • 2.8、Instrumentation
                      • 三、具体的启动过程
                        • 3.1、流程概述
                          • 3.2、流程跟踪
                            • 阶段一:Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)
                            • 阶段二:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后AMS会通知Launcher程序pause
                          • 阶段三: pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)
                            • 阶段五:进程创建后,执行ActivityThread.main()入口函数,
                              • 阶段六:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档