客户端
ContextImpl.java -> startActivity(Intent intent, Bundle options)
Instrumentation.java -> execStartActivity(...)
{
...
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);
...
}
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(...)
{
...
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.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) {
final ActivityStack focusedStack = display.getFocusedStack();
if (focusedStack != null) {
result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
} else if (targetStack == null) {
result |= resumeHomeActivity(null , "no-focusable-task",
display.getDefaultTaskDisplayArea());
}
}
...
}
->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(...)
{
...
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
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);
}
}
...
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);
...
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
...
}
-> Instrumentation::newActivity(...) -> Instrumentation::callActivityOnCreate(...)
-> Activity::performCreate() ->Activity::onCreate()
【Android 13源码分析】Activity启动流程-2 -
Android 11源码分析: Activity的启动流程 -
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!