客户端
ContextImpl.java -> startActivity(Intent intent, Bundle options)
Instrumentation.java -> execStartActivity(...)
{
...
//ActivityTaskManager利用binder,从客户端调用服务端的函数 1.0
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
checkStartActivityResult(result, intent);//检查启动Activity的结果,看是否存在异常 比如1.1
...
}
//1.0 引用
/* ActivityTaskManager.java
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
@UnsupportedAppUsage()
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
};*/
//1.1
checkStartActivityResult(int res, Object intent)
{
...
case ActivityManager.START_INTENT_NOT_RESOLVED:
case ActivityManager.START_CLASS_NOT_FOUND:
if (intent instanceof Intent && ((Intent)intent).getComponent() != null)
throw new ActivityNotFoundException(
"Unable to find explicit activity class "
+ ((Intent)intent).getComponent().toShortString()
+ "; have you declared this activity in your AndroidManifest.xml?");
throw new ActivityNotFoundException(
"No Activity found to handle " + intent);
case ActivityManager.START_PERMISSION_DENIED:
throw new SecurityException("Not allowed to start activity "
+ intent);
...
}
服务端
ActivityTaskManagerService.java -> startActivityAsUser(...)
{
...
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(opts)
.setUserId(userId)
.execute();
...
}
/*
obtainStarter()方法实际是调用了mFactory.obtain(),
而mFactory为ActivityStarter的内部类DefaultFactory,看下DefaultFactory的obtain()
frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
static class DefaultFactory implements Factory {
private final int MAX_STARTER_COUNT = 3;
private SynchronizedPool<ActivityStarter> mStarterPool =
new SynchronizedPool<>(MAX_STARTER_COUNT);
public ActivityStarter obtain() {
ActivityStarter starter = mStarterPool.acquire();
if (starter == null) {
if (mService.mRootWindowContainer == null) {
throw new IllegalStateException("Too early to start activity.");
}
starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
}
return starter;
}
}
obtain()的目的是拿到一个ActivityStarter对象,用来启动activity.
每个Intent对应一个ActivityStarter这里使用了SynchronizedPool--简单的对象池来管理对象的生产,
对象池里有3个对象,如果申请时池子里没有可用对象,则直接new一个!
*/
ActivityStartController.java -> execute()
ActivityStarter.java -> executeRequest()
{
...
(合法性检查abort)
2.0 权限检查 (ActivityStackSupervisor)mSupervisor.checkStartAnyActivityPermission()
2.1 是否能后台启动 shouldAbortBackgroundActivityStart()
2.2 拦截器 (ActivityStartInterceptor)mInterceptor.setStates() 例如,因为目标用户当前处于静默状态模式(关闭工作)或目标应用程序被挂起.
通过ActivityStartInterceptor检查各种拦截情况,如认为是潜在的恶意app(HarmfulApp)则改变intent为警告页面,到时不会跳转到原请求的activity
2.3 权限回顾 isPermissionsReviewRequired() 如果需要在启动真正目标activity前跳转到权限review页面,
则将原intent改为pending Intent传给review页面,待review结束后再继续启动
//2.4 Instant app(ephemeral app)启动ephemeral installer
2.5 创建ActivityRecord , final ActivityRecord r = new ActivityRecord(mService,..)
...
}
-> startActivityUnchecked(...) -> startActivityInner(...)
{
在ActivityStarer::startActivityInner方法中,通过getOrCreateRootTask()创建Task,
而后通过setNewTask方法将新建的ActivityRecord进行挂在到新建的Task上.
这一步AMS吧ActivityRecord和Task创建并且挂载到层级树,接下来是处理新的Activity启动和显示
}
RootWindowContainer
//堆栈打印
RootWindowContainer.java->resumeFocusedStacksTopActivities()->ActivityStack::resumeTopActivityUncheckedLocked()
{
...
if (!resumedOnDisplay) {
/*如果没有可用的activity在栈顶的时候,例如,设备刚刚启动或启动器崩溃,
程序会请求恢复集中堆栈中的顶部活动,确保至少在home活动被启动和恢复
*/
final ActivityStack focusedStack = display.getFocusedStack();
if (focusedStack != null) {
result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
} else if (targetStack == null) {
result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
display.getDefaultTaskDisplayArea());
}
}
...
}
/*
RootWindowContainer::resumeFocusedTasksTopActivities
Task::resumeTopActivityUncheckedLocked
Task::resumeTopActivityInnerLocked
TaskFragment::resumeTopActivity
TaskDisplayArea::pauseBackTasks -- 2.2.1 pause LauncherActivity (让之前启动activity(上一个应用) 进入onPause )
WindowContainer::forAllLeafTask
TaskFragment::forAllLeafTaskFragments
TaskFragment::startPausing
TaskFragment::startPausing
TaskFragment::schedulePauseActivity --构建 PauseActivityItem,这里是触发暂停launch
ActivityTaskManagerService::startProcessAsync -- 2.2.2创建app进程
*/
->ActivityStack::resumeTopActivityInnerLocked()-> ActivityStack::resumeTopActivityInnerLocked()-> ActivityStack::startPausingLocked()
{
...
ActivityRecord prev = mResumedActivity;
...
mAtmService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
...
}
->ClientLifecycleManager::scheduleTransaction() -> ClientTransaction::schedule()
->ApplicationThread::scheduleTransaction() -> ClientTransactionHandler::scheduleTransaction()->ClientTransactionHandler::sendMessage()
->内部类 H extends Handler 收到消息 case -> TransactionExecutor::performLifecycleSequence()
ActivityThread
//下面是重点
/*
ActivityThread::handleLaunchActivity
ActivityThread::performLaunchActivity
Instrumentation::newActivity --- 创建Activity
Activity::attach ---处理Window相关
Window::init
Window::setWindowManager
Instrumentation::callActivityOnCreate ---onCreate流程
Activity::performCreate
Activity::onCreate --activity流程over
*/
-> ActivityThread::handleLaunchActivity(...)-> ActivityThread::performLaunchActivity(...)
{
...
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);
}
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to instantiate activity " + component
+ ": " + e.toString(), e);
}
}
...
//执行attach,内部创建Window
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
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
...
}
-> Instrumentation::newActivity(...) -> Instrumentation::callActivityOnCreate(...)
// perform 执行
-> Activity::performCreate() ->Activity::onCreate()
【Android 13源码分析】Activity启动流程-2 -
Android 11源码分析: Activity的启动流程 -