Activity启动流程总结-生命周期

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言

对于Activity的启动流程,从事Android开发的同学都很熟悉。这里仅结合自己的理解,通过博文梳理和记录Activity启动流程关键节点,便于记忆和将来回顾。

官方Activity生命周期示意图:

activity-lifecycle

当 Activity A 启动 Activity B 时,它们各自的生命周期回调顺序是:

  1. Activity A 的 onPause() 方法执行。
  2. Activity B 的 onCreate()、onStart() 和 onResume() 方法依次执行。(Activity B 现在具有用户焦点。)
  3. 然后,如果 Activity A 在屏幕上不再可见,则其 onStop() 方法执行。

大家对于这样的结论都已熟知,但是ActivityManagerService是如何调度各Activity的生命回调,以及在什么时机调度等问题,就需要进入Activity的启动流程来找答案。

源码探究

文中源码基于Android 9.0

startActivity

首先通过activity.startActivity发起启动Activity的请求指令,startActivity最终调用Instrumentation的execStartActivity方法:

[Instrumentation.java]

public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
   
   
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    Uri referrer = target != null ? target.onProvideReferrer() : null;
    if (referrer != null) {
   
   
        intent.putExtra(Intent.EXTRA_REFERRER, referrer);
    }
    // 省略ActivityMonitor相关部分
    // ···
    try {
   
   
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess(who);
        // 获取IActivityManager binder通信接口,执行startActivity方法调用到AMS端
        int result = ActivityManager.getService()
            .startActivity(whoThread, who.getBasePackageName(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()),
                    token, target != null ? target.mEmbeddedID : null,
                    requestCode, 0, null, options);
        checkStartActivityResult(result, intent);
    } catch (RemoteException e) {
   
   
        throw new RuntimeException("Failure from system", e);
    }
    return null;
}

该方法中通过IActivityManager.startActivity方法将指令和参数传递给ActivityManagerService,触发ActivityManagerService对应的startActivity方法。

startActivityAsUser

ActivityManagerService的startActivity方法中又执行到startActivityAsUser方法:

[ActivityManagerService.java]

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
        boolean validateIncomingUser) {
   
   
    enforceNotIsolatedCaller("startActivity");

    // 根据uid检查权限并返回修正后的uid
    userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,
            Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

    // TODO: Switch to user app stacks here.
    // 获取ActivityStarter(用于配置和执行启动Activity),调用其execute方法执行启动
    return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
            .setCaller(caller)
            .setCallingPackage(callingPackage)
            .setResolvedType(resolvedType)
            .setResultTo(resultTo)
            .setResultWho(resultWho)
            .setRequestCode(requestCode)
            .setStartFlags(startFlags)
            .setProfilerInfo(profilerInfo)
            .setActivityOptions(bOptions)
            .setMayWait(userId)
            .execute();
}

该方法中通过ActivityStarter保存启动参数,然后执行启动,execute方法中将调用startActivityMayWait方法。

startActivityMayWait

[ActivityStarter.java]

private int startActivityMayWait(IApplicationThread caller, int callingUid,
        String callingPackage, Intent intent, String resolvedType,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int startFlags,
        ProfilerInfo profilerInfo, WaitResult outResult,
        Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,
        int userId, TaskRecord inTask, String reason,
        boolean allowPendingRemoteAnimationRegistryLookup) {
   
   
    // Refuse possible leaked file descriptors
    if (intent != null && intent.hasFileDescriptors()) {
   
   
        throw new IllegalArgumentException("File descriptors passed in Intent");
    }
    mSupervisor.getActivityMetricsLogger().notifyActivityLaunching();
    // 标记intent有明确设置接收的组件
    boolean componentSpecified = intent.getComponent() != null;

    final int realCallingPid = Binder.getCallingPid();
    final int realCallingUid = Binder.getCallingUid();

    int callingPid;
    if (callingUid >= 0) {
   
   
        callingPid = -1;
    } else if (caller == null) {
   
   
        callingPid = realCallingPid;
        callingUid = realCallingUid;
    } else {
   
   
        callingPid = callingUid = -1;
    }
    
    // 创建intent的副本
    // Save a copy in case ephemeral needs it
    final Intent ephemeralIntent = new Intent(intent);
    // Don't modify the client's object!
    intent = new Intent(intent);
    // 省略拦截处理跳转InstantAPP安装相关部分 ···
    
    // 通过PackageManagerService查询该intent是否有匹配的ResolveInfo
    ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,
            0 /* matchFlags */,
                    computeResolveFilterUid(
                            callingUid, realCallingUid, mRequest.filterCallingUid));
    if (rInfo == null) {
   
   
        // 省略ResolveInfo未找到情况的处理部分
        // ···
    }
    // Collect information about the target of the Intent.
    // 获取ResolveInfo中的ActivityInfo
    ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
    
    synchronized (mService) {
   
   
        // 获取处于焦点的ActivityStack
        final ActivityStack stack = mSupervisor.mFocusedStack;
        stack.mConfigWillChange = globalConfig != null
                && mService.getGlobalConfiguration().diff(globalConfig) != 0;
        if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
                "Starting activity when config will change = " + stack.mConfigWillChange);

        final long origId = Binder.clearCallingIdentity();
        
        // 省略heavy-weight进程处理部分 ···
        
        // 用来保存start Activity过程中创建或复用的ActivityRecord
        final ActivityRecord[] outRecord = new ActivityRecord[1];
        // 进一步执行启动Activity
        int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
                voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
                callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
                ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
                allowPendingRemoteAnimationRegistryLookup);

        Binder.restoreCallingIdentity(origId);
        
        // 省略更新Configuration部分 ···
        
        // 省略对启动结果outResult的处理部分,若存在需要等待目标Activity所在进程启动
        // 或等待特定Activity可见等情况,则将阻塞等待唤醒再返回结果。
        // ···
    }
}

该方法中对intent做了检查之后,调用startActivity方法进一步进行启动流程,其中又调用另一个startActivity重载方法:

[ActivityStarter.java]

private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
        String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
        String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
        SafeActivityOptions options,
        boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,
        TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) {
   
   
    // err记录运行结果,默认记为START_SUCCESS
    int err = ActivityManager.START_SUCCESS;
    // Pull the optional Ephemeral Installer-only bundle out of the options early.
    final Bundle verificationBundle
            = options != null ? options.popAppVerificationBundle() : null;
    
    // 调用端(即发起start请求的APP进程)对应的ProcessRecord
    ProcessRecord callerApp = null;
    if (caller != null) {
   
   
        // 从AMS中的缓存集合获取
        callerApp = mService.getRecordForAppLocked(caller);
        if (callerApp != null) {
   
   
            // 获取调用端pid、uid
            callingPid = callerApp.pid;
            callingUid = callerApp.info.uid;
        } else {
   
   
            // 正常情况下,APP进程都会在AMS有一个ProcessRecord。若无,则认为非法。
            Slog.w(TAG, "Unable to find app for caller " + caller
                    + " (pid=" + callingPid + ") when starting: "
                    + intent.toString());
            err = ActivityManager.START_PERMISSION_DENIED;
        }
    }
    
    // ActivityRecord对应表示Activity栈中的一个Activity
    // sourceRecord表示调用端Activity
    ActivityRecord sourceRecord = null;
    // resultRecord表示在onActivityResult接收结果的Activity
    ActivityRecord resultRecord = null;
    // resultTo表示调用端Activity的token,可通过它获取Activity对应的ActivityRecord
    if (resultTo != null) {
   
   
        sourceRecord = mSupervisor.isInAnyStackLocked(resultTo);
        if (DEBUG_RESULTS) Slog.v(TAG_RESULTS,
                "Will send result to " + resultTo + " " + sourceRecord);
        if (sourceRecord != null) {
   
   
            if (requestCode >= 0 && !sourceRecord.finishing) {
   
   
                // 当需要回调onActivityResult的情况下,即调用startActivityForResult方法
                // requestCode参数大于0,resultRecord即为sourceRecord
                resultRecord = sourceRecord;
            }
        }
    }
    
    // 获取intent中设置的启动标识
    final int launchFlags = intent.getFlags();

    if ((launchFlags & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
   
   
        // 省略处理FLAG_ACTIVITY_FORWARD_RESULT相关部分
        // ···
    }
    
    if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
   
   
        // We couldn't find a class that can handle the given Intent.
        // That's the end of that!
        err = ActivityManager.START_INTENT_NOT_RESOLVED;
    }

    if (err == ActivityManager.START_SUCCESS && aInfo == null) {
   
   
        // We couldn't find the specific class specified in the Intent.
        // Also the end of the line.
        err = ActivityManager.START_CLASS_NOT_FOUND;
    }
    
    // 省略检查语音会话时启动Activity部分,若目标Activity不支持VOICE类别,则标记
    // err = ActivityManager.START_NOT_VOICE_COMPATIBLE
    // ···
    
    final ActivityStack resultStack = resultRecord == null ? null : resultRecord.getStack();

    // 若err标记为失败,则终止启动
    if (err != START_SUCCESS) {
   
   
        if (resultRecord != null) {
   
   
            // 通知调用端onActivityResult,并传回RESULT_CANCELED
            resultStack.sendActivityResultLocked(
                    -1, resultRecord, resultWho, requestCode, RESULT_CANCELED, null);
        }
        SafeActivityOptions.abort(options);
        return err;
    }
    
    // 检查权限,若权限不通过则将abort标记为true
    boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho,
            requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity,
            inTask != null, callerApp, resultRecord, resultStack);
    abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
            callingPid, resolvedType, aInfo.applicationInfo);
            
    // 省略动画选项设置相关部分 ···
    
    // 省略IActivityController部分,用于监听拦截Activity启动,可通过AMS.setActivityController
    // 设置监听器,若拦截将标记abort=true。
    // 省略ActivityStartInterceptor部分 ···
    
    // 判断是否终止
    if (abort) {
   
   
        if (resultRecord != null) {
   
   
            // 通知调用端onActivityResult,并传回RESULT_CANCELED
            resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
                    RESULT_CANCELED, null);
        }
        // We pretend to the caller that it was really started, but
        // they will just get a cancel result.
        ActivityOptions.abort(checkedOptions);
        return START_ABORTED;
    }
    
    // 省略权限检查部分 ···
    // 省略临时安装APP部分 ···
    
    // 新建ActivityRecord,保存Activity启动相关参数
    ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
            callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
            resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
            mSupervisor, checkedOptions, sourceRecord);
    if (outActivity != null) {
   
   
        outActivity[0] = r;
    }
    
    // 省略赋值AppTimeTracker部分 ···
    // 省略检查是否允许应用切换部分 ···
    
    return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
            true /* doResume */, checkedOptions, inTask, outActivity);
}

该方法中对当前能否启动目标Activity进行了各项检查,并创建ActivityRecord用以保存Activity启动信息,其中还有涉及Activity启动拦截器的调用(若有设置)。最后调用了另一个重载方法startActivity,其中又调用startActivityUnchecked方法。

startActivityUnchecked

[ActivityStarter.java]

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
        IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
        int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
        ActivityRecord[] outActivity) {
   
   

    // 初始化ActivityStarter的成员变量,用当前启动信息设置
    setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
            voiceInteractor);

    // 调整启动标识
    computeLaunchingTaskFlags();

    // 获取sourceRecord的ActivityStack,若调用端Activity即将finish,则修改启动标识
    computeSourceStack();
    
    // 设置调整后的启动标识
    mIntent.setFlags(mLaunchFlags);
    
    // 根据启动标识和启动模式检查是否新建TASK或加入现有TASK。若加入现有TASK,则返回该TASK中可重用的ActivityRecord。
    ActivityRecord reusedActivity = getReusableIntentActivity();
    
    // 省略窗口模式相关部分 ···
    
    if (reusedActivity != null) {
   
   
        // 省略设置ActivityRecord和对应TaskRecord,根据启动模式和启动标识清理任务栈,
        // 触发复用Activity的onNewIntent方法等等部分
        // ···
    }
    
    // 省略检查packageName部分 ···
    // 省略当目标Activity与当前顶部Activity一致时,根据启动标识和模式判断是否不启动新Activity以及对应的处理的相关部分
    
    // 省略设置TaskRecord部分
    
    // 省略权限设置
    // ···
    
    // 进行TaskRecord、APP Window Token、动画、窗口复用等相关检查和配置
    mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
            mOptions);
    if (mDoResume) {
   
   
        final ActivityRecord topTaskActivity =
                mStartActivity.getTask().topRunningActivityLocked();
        if (!mTargetStack.isFocusable()
                || (topTaskActivity != null && topTaskActivity.mTaskOverlay
                && mStartActivity != topTaskActivity)) {
   
   
            // If the activity is not focusable, we can't resume it, but still would like to
            // make sure it becomes visible as it starts (this will also trigger entry
            // animation). An example of this are PIP activities.
            // Also, we don't want to resume activities in a task that currently has an overlay
            // as the starting activity just needs to be in the visible paused state until the
            // over is removed.
            mTargetStack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
            // Go ahead and tell window manager to execute app transition for this activity
            // since the app transition will not be triggered through the resume channel.
            mService.mWindowManager.executeAppTransition();
        } else {
   
   
            // If the target stack was not previously focusable (previous top running activity
            // on that stack was not visible) then any prior calls to move the stack to the
            // will not update the focused stack.  If starting the new activity now allows the
            // task stack to be focusable, then ensure that we now update the focused stack
            // accordingly.
            if (mTargetStack.isFocusable() && !mSupervisor.isFocusedStack(mTargetStack)) {
   
   
                mTargetStack.moveToFront("startActivityUnchecked");
            }
            // resumeFocusedStackTopActivityLocked方法进一步执行启动操作
            mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,
                    mOptions);
        }
    } else if (mStartActivity != null) {
   
   
        // 加入最近任务列表
        mSupervisor.mRecentTasks.add(mStartActivity.getTask());
    }
    mSupervisor.updateUserStackLocked(mStartActivity.userId, mTargetStack);

    mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(), preferredWindowingMode,
            preferredLaunchDisplayId, mTargetStack);

    return START_SUCCESS;
}

该方法中会进行启动标识和启动模式检查,判断是否要复用的TaskRecord、ActivityRecord还是重新创建。若要新启动一个Activity,则调用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked方法,继续进行启动流程。

resumeFocusedStackTopActivityLocked

[ActivityStackSupervisor.java]

boolean resumeFocusedStackTopActivityLocked(
        ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
   
   

    if (!readyToResume()) {
   
   
        return false;
    }

    // 判断目标Activity栈是否处于焦点,是的话则调用其resumeTopActivityUncheckedLocked方法进一步进行启动流程
    if (targetStack != null && isFocusedStack(targetStack)) {
   
   
        return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
    }

    // ···

    return false;
}

该方法中主要对Activity栈的焦点进行检查,之后便通过ActivityStack的resumeTopActivityUncheckedLocked继续执行启动流程。

resumeTopActivityUncheckedLocked

[ActivityStack.java]

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
   
   
    // inResumeTopActivity标记当前处于resumeTopActivity过程中,用于避免重复递归调用。
    if (mStackSupervisor.inResumeTopActivity) {
   
   
        // Don't even start recursing.
        return false;
    }

    boolean result = false;
    try {
   
   
        // Protect against recursion.
        mStackSupervisor.inResumeTopActivity = true;
        // Activity启动流程核心方法
        result = resumeTopActivityInnerLocked(prev, options);

        // When resuming the top activity, it may be necessary to pause the top activity (for
        // example, returning to the lock screen. We suppress the normal pause logic in
        // {@link #resumeTop
Android Framework学习笔记(五)应用程序启动过程 注释1调用了doPendingActivityLaunchesLocked方法。 ActivityStarter#doPendingActivityLaunchesLocked() final void doPendingActivityLaunchesLocked(boolean doResume) { while (!mPendingActivityLaunches.isEmpty()) { final PendingActivityLaunch pal = mPendingActivityLaunch 阅读详情

相关推荐

resume栈顶Activity--Android P

ActivityStackSuperior#resumeFocusedStackTopActivityLocked() ->ActivityStack#resumeTopActivityUncheckedLocked()->resumeTopActivityInnerLocked() final ClientTransaction transaction = ClientTrans...

淡淡的宁静的博客 1185

Android中的Activity生命周期启动流程及优化策略

通过实验分析,我们可以更深入地理解Activity生命周期的变化规律和性能影响。这些实验结果不仅验证了理论分析的准确性,还为实际应用开发提供了有力的支持和指导。在实际应用中,开发者可以根据实验结果来优化Activity生命周期管理策略,提高应用的性能和用户体验。例如,根据实验数据调整资源加载策略,减少不必要的资源消耗;优化关键回调方法的实现,提高界面响应速度;合理设计Activity之间的跳转逻辑,确保用户体验的流畅性。这些优化措施将有助于提升Android应用的整体性能和用户满意度。

大模型大数据攻城狮的专栏 1247

二.Activity启动流程-ATMS到ApplicationThread的调用过程

Activity启动一般分为普通Activity启动,根Activity启动.而根Activity是指应用启动的第一个Activity过程,所以也可以理解为应用的启动过程. 相关内容链接:android系统启动流程

你只是看起很努力 1608

Android中的Activity生命周期启动流程详解

了解Activity生命周期对于开发Android应用程序非常重要,可以帮助开发者在适当的时机执行一些必要的操作,如资源的释放和数据的保存等。启动Activity生命周期方法:当调用startActivity()方法时,Android系统会检查要启动Activity是否存在,并且将其添加到启动堆栈中。调用startActivity()方法:要启动一个新的Activity,我们可以通过调用当前Activity的startActivity()方法来实现。一、Activity生命周期

CodeSpark的博客 352

解析Activity启动-生命周期角度

书接上回,在 AMS侧解析Activity启动 篇章中,我们大致梳理了 Activity 启动过程中涉及到堆栈的整体流程,本篇再让我们从 Activity 生命周期的角度来梳理整个流程顺着上一篇 解析Activity启动-堆栈篇 的流程,在启动Activity时,会在 函数中调用 函数对发起者Activity触发 Pause 动作,那么我们就按照启动顺序,进行逐一分析 首先是调用起点,剔除与Pause流程无关的代码;可以看到,只有在对应 stack中存在 时,才会去触发进行Pause流程,很好理解,

super_marie的博客 1312

Framework学习(五)应用程序启动过程

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。需要的朋友可以私信我【资料】或者点这里免费领取。

m0_61369275的博客 527

Android 深入研究之 ✨ Activity启动流程+Activity生命周期

Activity启动流程 1、首先从Activity类的startActivity()方法开始: @Override public void startActivity(Intent intent, @Nullable Bundle options) { if (options != null) { startActivityForResult(intent, -1, options); } else { // Note we want to go throu

努力前行,总会成为自己心中的那道光 4641

Activity生命周期启动流程启动模式

Activity 1、activity启动流程: ————》点击App的icon ————》在Laucher的onClick方法中,调用startActivitySafely方法(Laucher继承于Activity) ————》startActivitySafely方法中携带一个intent,intent中包含着我们在AndroidManifest.xml注册的 ...

戒不掉的码瘾 404

【安卓 R 源码】Activity 启动流程及其生命周期源码分析

1. Activty 的生命周期 activity生命周期 oncreate()->onstart()->onResume()->onPause()->onStop()->onDestory() onCreate(): 当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。 onStart(): onCreate()方法完成后,此时activity进入.

mike_jun的博客 4338

activity 生命周期_Activity启动流程

概览Activity 启动流程比较复杂,分析起来很容易陷入复杂的代码中去,所以我这篇分析文章不会深入的分析代码细节,尽量抛开不重要的东西把启动流程按照重点分成几个部分来分析。下图是 Activity 启动流程的总览。(上图红色方块是与 WMS 关联的部分,后面会从这里开始介绍 WMS)后面我们将以 Android 29 为例,按照上图步骤逐步分析。Intent 解析到 Activity调...

weixin_39722917的博客 83

Activity启动流程(七)初始化目标Activity并执行相关生命周期流程

    Activity启动流程源码实现(七)初始化目标Activity Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现详解概要 Android四大组件之Activity启动流程源码实现详解(一) Android四大组件之Activity启动流程源码实现详解(二) Activity启动流程(三)- Activity Task调度算法复盘分析 Acti

IT先森 4383

Activity生命周期在四种启动模式下的运行流程

Demo中有MainActivity、Main2Activity、Main3Activity、Main4Activity四个Activity,主要是通过改变Main2Activity启动模来观察不同模式下,Activity各个生命周期的运行流程 一、Standard standard( 标准模式 ):每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在,并且它会进入启动者所...

Duckdan的博客 512

Activity生命周期流程以及Activity启动模式,Activity和组件、Service、Fragment的通信

正常的流程: onCreate():被创建的时候被回调, onStart():Activity正在启动状态,处于可见但无法交互,但处在后台 onResume():已经在前台可见,可以和用户交互,Activity已经在运行 onPause():Activity正在停止,和onResume()成对出现 onStop():即将停止,或被新的Activity覆盖,Activity不可见,在后台运行 onDestory():Activity正在被销毁,回收和资源的释放,和onCreate()成

weixin_43500320的博客 215

Activity启动流程生命周期

借用别人的一句话总结。 Activity启动流程,你不用关心在AMS里面这里跳到那里是干什么,还有ActivityStack以及它的那个SuperXX跳来跳去是在搞毛,你需要了解的是:在Context里面,通过AMS的Client ActivityManagerNative发起Binder调用进入system_server进程,在AMS里面绕了一圈(处理Activity栈以及生命周期相关),然后

罐v子的博客 551

终极Android开源项目分析指南:从Activity启动流程生命周期的完整解析

在Android开发中,Activity作为用户界面的核心组件,其启动流程生命周期管理是每个开发者必须掌握的基础技能。本教程将带你通过Android开源项目分析,快速理解Activity的工作原理、启动流程生命周期管理,帮助你构建更稳定、高效的Android应用。 ## 📌 Activity工作原理:Android应用的核心引擎 Activity是Android系统中负责与用户交互的组件

gitblog_00750的博客 1058

Framework面试三:说说Activity启动流程生命周期管理)

相关文章: Activity生命周期管理 一、这道题想考察什么? 1、启动Activity会经历哪些生命周期回调? 【Android】源码分析 - Activity启动流程 2、冷启动大致流程,涉及哪些组件,通信过程是怎么样的? 3、Activity启动过程中,生命周期回调的原理? ...

songzi1228的博客 1280

Android activity启动生命周期调用流程

1 Activity是有主线程ActivityThread启动,找到ActivityThread.java文件,找到其中的main函数。 2 可以看到在main函数中new了ActivityThread,并且调用了attach接口。 3 接着详细看attach接口,其中可以找到在这个接口中获取了activityManager, 其中mAppThread是ApplicationThread对象,...

zchy198799的博客 449

Activity的冷启动生命周期

本文基于android12,13 进行分析activity启动流程如下几个步骤。

qq_41095045的博客 1243

Activity启动流程分析四 ActivtyB的生命周期执行和ActivityA的生命周期执行

我们可以看到onStart生命周期并不是AMS去控制App进程去执行的,AMS只是给了App进程一个ClientTranstion事务,这个事务里面规定了Activity的开始生命周期和结束生命周期,分别是LaunchActivityItem和ResumeActivityItem。AMS在ClientTransaction里面添加了一个起始生命周期和结束生命周期,那么对应的在我们App进程里面的TransactionExecutor事务处理器里面,也是分两步进行。

qq_42426725的博客 1166
上一篇: Activity启动流程总结-ActivityThread
下一篇: Activity启动流程总结-超时判定机制
分则能成
博客等级 码龄15年 47粉丝 49原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值