客户端
ContextImpl.java -> startActivity(Intent intent, Bundle options)Instrumentation.java -> execStartActivity(...)
{...//ActivityTaskManager利用binder,从客户端调用服务端的函数 1.0int 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>() {@Overrideprotected IActivityTaskManager create() {inal 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.javastatic 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为警告页面,到时不会跳转到原请求的activity2.3 权限回顾 isPermissionsReviewRequired() 如果需要在启动真正目标activity前跳转到权限review页面,则将原intent改为pending Intent传给review页面,待review结束后再继续启动//2.4 Instant app(ephemeral app)启动ephemeral installer2.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::resumeFocusedTasksTopActivitiesTask::resumeTopActivityUncheckedLockedTask::resumeTopActivityInnerLockedTaskFragment::resumeTopActivity TaskDisplayArea::pauseBackTasks -- 2.2.1 pause LauncherActivity WindowContainer::forAllLeafTaskTaskFragment::forAllLeafTaskFragmentsTaskFragment::startPausingTaskFragment::startPausingTaskFragment::schedulePauseActivity --构建 PauseActivityItem,这里是触发暂停launchActivityTaskManagerService::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::handleLaunchActivityActivityThread::performLaunchActivityInstrumentation::newActivity --- 创建ActivityActivity::attach ---处理Window相关Window::initWindow::setWindowManagerInstrumentation::callActivityOnCreate ---onCreate流程Activity::performCreateActivity::onCreate --activity流程over
*/
-> ActivityThread::handleLaunchActivity(...)-> ActivityThread::performLaunchActivity(...)
{...Activity activity = null;try {java.lang.ClassLoader cl = appContext.getClassLoader();//创建Activityactivity = 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,内部创建Windowactivity.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);...//通知activityif (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的启动流程 -