在Android开发中,Activity是最常用的组件之一。Activity的启动流程比较复杂,涉及到多个系统组件和类的协同工作。本文将对Activity的启动流程进行源码解析。
Activity的启动是通过调用startActivity()方法实现的。这个方法主要做了以下几件事情:
下面我们逐一解析这个过程。
Intent是一个Android中非常重要的组件。它可以用来启动Activity、Service、BroadcastReceiver等组件。在Activity的启动过程中,Intent主要用来传递Activity的信息。Intent包含以下信息:
Intent的构造方法如下:
public Intent(Context packageContext, Class> cls) {
this(packageContext, cls, null);
}
public Intent(Context packageContext, Class> cls, String action) {
mComponent = new ComponentName(packageContext, cls);
setAction(action);
}
在这个构造方法中,我们传入了要启动的Activity的类名和所属的包名。然后通过ComponentName类将它们组合成一个组件。最后通过setAction()方法设置要执行的操作。
ActivityManagerService(AMS)是Android系统中一个非常重要的服务。它负责管理应用程序的进程、Activity、Service等组件。在Activity的启动过程中,AMS主要负责以下几个工作:
AMS的startActivity()方法的实现如下:
public int startActivity(IApplicationThread caller, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int flags, ProfilerInfo profilerInfo, Bundle options) {
…
boolean componentSpecified = intent.getComponent() != null;
if (!componentSpecified && intent.resolveActivity(mService.getPackageManager()) == null) {
if (showActivityError(caller, token, "No Activity found to handle "
+ intent.toString())) {
res = ActivityManager.START_RETURN_INTENT_TO_CALLER;
} else {
// If we are not allowing this for the caller then we
// just immediately finish, letting the caller know
// they can’t do this.
return ActivityManager.START_CANCELED;
}
} else {
try {
/*
* The activity is not found, so we need to get the
* activity to run from somewhere. In this case, we
* will use the application package’s default activity
* if there is no activity specified in the Intent.
*/
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, resolvedType, 0, null, userId);
…
// Check whether the activity should be launched in a new task.
final int res = startActivityLocked(caller, intent, resolvedType, aInfo,
resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid,
realCallingUid, startFlags, options, componentSpecified, null, null);
…
} catch (RuntimeException e) {
…
}
}
…
}
在AMS的startActivity()方法中,首先通过resolveActivity()方法找到要启动的Activity的信息。如果找不到Activity的信息,就会抛出异常。如果找到Activity的信息,就会调用startActivityLocked()方法启动Activity。
ActivityThread是Android系统中一个非常重要的线程。它负责管理Activity的生命周期,以及处理与Activity相关的消息。在Activity的启动过程中,ActivityThread主要负责以下几个工作:
ActivityThread的main()方法是整个应用程序的入口。它会创建一个Looper对象,并通过它来接收消息。在Activity的启动过程中,ActivityThread会处理以下消息:
ActivityThread的main()方法的实现如下:
public static void main(String[] args) {
…
Looper.prepareMainLooper();
…
ActivityThread thread = new ActivityThread();
thread.attach(false);
…
Looper.loop();
…
}
在ActivityThread的attach()方法中,会创建一个Application对象和一个Instrumentation对象。然后根据Activity的信息,创建一个Activity对象,并调用它的onCreate()方法。最后将Activity添加到WindowManager中,显示在屏幕上。
通过以上分析,我们可以看出,Activity的启动流程非常复杂,涉及到多个系统组件和类的协同工作。在实际开发中,我们只需要关注startActivity()方法即可,剩下的工作都是由Android系统自动完成的。但是,了解Activity的启动流程对于我们理解Android系统的运作原理是非常有帮助的。