Activity启动流程和生命周期

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

借用别人的一句话总结。
Activity的启动流程,你不用关心在AMS里面这里跳到那里是干什么,还有ActivityStack以及它的那个SuperXX跳来跳去是在搞毛,你需要了解的是:在Context里面,通过AMS的Client ActivityManagerNative发起Binder调用进入system_server进程,在AMS里面绕了一圈(处理Activity栈以及生命周期相关),然后通过IApplicationThread这个Binder调用回到App进程的Binder线程池,在线程池里面通过Handler发送Message到App主线程,最终通过ClassLoader加载Activity类,创建对象,回调对应的生命周期,整个过程结束。

作者:weishu
链接:https://www.zhihu.com/question/46486807/answer/122513260

以下为Activity的启动流程。

1、调用startActivity()或startActivityForResult()方法,最终都会调用startActivityForResult()方法。

2、startActivityForResult()方法中,会判定是否有父Activity,如果没有,则调用

Instrumentation.ActivityResult ar =
    mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), mToken, this,
        intent, requestCode, options); 

如果有父Activity,则调用以下代码

if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
但是事实上,startActivityFromChild,也会调用Instrumentation的execStartActivity()方法。

3、在execStartActivity()方法中,会调用ActivityManagerNative.getDefault().startActivity()方法,ActivityManagerNative.getDefault()返回一个IBinder类型
(这一步不是很懂,应该是在这里通过IBinder发送了启动Activity的消息)
看了开发艺术后,发现在getDefault得到的其实就是一个AMS,在这里调用的就是AMS中的startActivity()方法

int result = ActivityManagerNative.getDefault()
    .startActivity(whoThread, who.getBasePackageName(), intent,
            intent.resolveTypeIfNeeded(who.getContentResolver()),
            token, target, requestCode, 0, null, options); 

4、在ActivityStack中的resumeTopActivityInnerLocked方法中,有这么一段代码,用于将栈顶的ActivityonPause之后,才能启动新的Activity

// We need to start pausing the current activity so the top one can be resumed...
final boolean dontWaitForPause = (next.info.flags & FLAG_RESUME_WHILE_PAUSING) != 0;
boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause);
if (mResumedActivity != null) {
    if (DEBUG_STATES) Slog.d(TAG_STATES,
            "resumeTopActivityLocked: Pausing " + mResumedActivity);
    pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);
}

在处理完栈顶Activity和Window状态后,调用以下方法
mStackSupervisor.startSpecificActivityLocked(next, true, false);

进入到startSpecificActivityLocked()方法中,再调用realStartActivityLocked()方法,该方法里有这么一段代码,这里的thread为IApplicationThread

app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
        System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
        new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
        task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
        newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); 

IApplicationThread只是一个接口,他的具体实现是在ActivityThread中的ApplicationThread。
在该类中,通过Handler类H,发送了一条消息
sendMessage(H.LAUNCH_ACTIVITY, r);

在H类中,接收到了LAUCH_ACTIVITY消息后,调用了以下方法

case LAUNCH_ACTIVITY: {
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

    r.packageInfo = getPackageInfoNoCheck(
            r.activityInfo.applicationInfo, r.compatInfo);
    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break; </php>

handleLaunchActivity()方法中又调用了以下方法
Activity a = performLaunchActivity(r, customIntent);   //调用方法实现Activity的onCreate和onStart

 <php>if (a != null) {
    r.createdConfig = new Configuration(mConfiguration);
    reportSizeConfigurations(r);
    Bundle oldState = r.state;
    handleResumeActivity(r.token, false, r.isForward,
            !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);//实现Activity的onResume

在performLaunchActivity()中调用了以下两个方法实现了Activity的onCreate和onStart

if (r.isPersistable()) {
    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
    mInstrumentation.callActivityOnCreate(activity, r.state);
}

if (!r.activity.mFinished) {
    activity.performStart();
    r.stopped = false;
}

同时,performLaunchActivity()这个方法还完成了如下几件事

从ActivityClientRecord中获取待启动的Activity的组件信息

ActivityInfo aInfo = r.activityInfo;
if (r.packageInfo == null) {
    r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
            Context.CONTEXT_INCLUDE_CODE);
}

ComponentName component = r.intent.getComponent();
if (component == null) {
    component = r.intent.resolveActivity(
        mInitialApplication.getPackageManager());
    r.intent.setComponent(component);
}

if (r.activityInfo.targetActivity != null) {
    component = new ComponentName(r.activityInfo.packageName,
            r.activityInfo.targetActivity);
} 

通过Instrumentation的newActivity方法使用类加载类器创建Activity对象

Activity activity = null;
try {
    java.lang.ClassLoader cl = r.packageInfo.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);
    }
} 

newActivity中通过类加载器来创建Activity对象

public Activity newActivity(ClassLoader cl, String className,
        Intent intent)
        throws InstantiationException, IllegalAccessException,
        ClassNotFoundException {
    return (Activity)cl.loadClass(className).newInstance();
} 

通过LoadedApk的makeApplication方法来尝试创建Application对象

public Application makeApplication(boolean forceDefaultAppClass,
        Instrumentation instrumentation) {
    if (mApplication != null) {
        return mApplication;
    }

    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication");

    Application app = null;

    String appClass = mApplicationInfo.className;
    if (forceDefaultAppClass || (appClass == null)) {
        appClass = "android.app.Application";
    }

    try {
        java.lang.ClassLoader cl = getClassLoader();
        if (!mPackageName.equals("android")) {
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                    "initializeJavaContextClassLoader");
            initializeJavaContextClassLoader();
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        }
        ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
        app = mActivityThread.mInstrumentation.newApplication(
                cl, appClass, appContext);
        appContext.setOuterContext(app);
    } catch (Exception e) {
        if (!mActivityThread.mInstrumentation.onException(app, e)) {
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            throw new RuntimeException(
                "Unable to instantiate application " + appClass
                + ": " + e.toString(), e);
        }
    }
    mActivityThread.mAllApplications.add(app);
    mApplication = app;

    if (instrumentation != null) {
        try {
            instrumentation.callApplicationOnCreate(app);
        } catch (Exception e) {
            if (!instrumentation.onException(app, e)) {
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                throw new RuntimeException(
                    "Unable to create application " + app.getClass().getName()
                    + ": " + e.toString(), e);
            }
        }
    }

    。。。。。。

    return app;
}

创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化

if (activity != null) {
    Context appContext = createBaseContextForActivity(r, activity);
    CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
    Configuration config = new Configuration(mCompatConfiguration);
    if (r.overrideConfig != null) {
        config.updateFrom(r.overrideConfig);
    }
    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
            + r.activityInfo.name + " with config " + config);
    Window window = null;
    if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
        window = r.mPendingRemoveWindow;
        r.mPendingRemoveWindow = null;
        r.mPendingRemoveWindowManager = null;
    }
    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);

    if (customIntent != null) {
        activity.mIntent = customIntent;
    }
    r.lastNonConfigurationInstances = null;
    activity.mStartedActivity = false;
    int theme = r.activityInfo.getThemeResource();
    if (theme != 0) {
        activity.setTheme(theme);    //设置Activity的Theme
    }


到此为止,一个Activity的启动就算完成了。

类似的,还有重启Activity,暂停Activity等

case RELAUNCH_ACTIVITY: {
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
    ActivityClientRecord r = (ActivityClientRecord)msg.obj;
    handleRelaunchActivity(r);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case PAUSE_ACTIVITY: {
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
    SomeArgs args = (SomeArgs) msg.obj;
    handlePauseActivity((IBinder) args.arg1, false,
            (args.argi1 & USER_LEAVING) != 0, args.argi2,
            (args.argi1 & DONT_REPORT) != 0, args.argi3);
    maybeSnapshot();
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case STOP_ACTIVITY_SHOW: {
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
    SomeArgs args = (SomeArgs) msg.obj;
    handleStopActivity((IBinder) args.arg1, true, args.argi2, args.argi3);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case STOP_ACTIVITY_HIDE: {
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
    SomeArgs args = (SomeArgs) msg.obj;
    handleStopActivity((IBinder) args.arg1, false, args.argi2, args.argi3);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case DESTROY_ACTIVITY:
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
    handleDestroyActivity((IBinder)msg.obj, msg.arg1 != 0,
            msg.arg2, false);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    break;

关于Activity生命周期 Activity是一个很重要、很复杂的组件,他的启动不像我们平时直接new一个对象就完事了,他需要经历一系列的初始化。例如"刚创建状态",“后台状态”,“可见状态”等等。当我们在界面之间进行切换的时候,activity也会在多种状态之间进行切换,例如可见或者不可见状态、前台或者后台状态。当Activity在不同的状态之间切换时,会回调不同的生命周期方法。我们可以重写这一些方法,当进入不同的状态的时候,执行对应的逻辑。生命周期的一个重要作用就是让activity在不同状态之间切换的时候,可以执行对应的逻辑。 阅读详情

相关推荐

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

文章目录前言源码探究startActivitystartActivityAsUserstartActivityMayWaitstartActivityUncheckedresumeFocusedStackTopActivityLockedresumeTopActivityUncheckedLockedresumeTopActivityInnerLocked1.pause当前显示的Activitys...

chidh的博客 2990

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

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

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

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

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

mike_jun的博客 4338

Android Activity生命周期介绍及启动时间抓取

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33716941的博客 287

Activity生命周期启动

Activity生命周期启动方式与流程 从安卓入门到现在,从事安卓开发已经有三年有余的时间了,对安卓开发的经验在逐步积累,解决问题的思路更加清晰,方式也越来越广泛。安卓最重要的就是四大组件,分别是Activity、Service、ReceiverContentProvider。其中我们用到的最广泛的就是Activity,基本上每天都要使用,所以本章文章我将对activity进行一次梳理。其...

gaozhilu88520的博客 547

Activity启动流程(Android 13)

Activity启动过程分为两种:一种是普通 Activity启动过程,另一种是根 Activity启动过程。普通 Activity 指的是除应用程序启动的第一个 Activity 之外的其他 Activity

xingyu19911016的博客 2万+

Activity生命周期详解(转载文章)

学习总结之用,上图 Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的。今天我们就来详细地聊聊Activity生命周期,以便我们在以后的开发中能如鱼得水。 一、初识Activity   在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口。当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一

weixin_40862356的博客 2754

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

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

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

CodeSpark的博客 353

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

终极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的开始生命周期结束生命周期,分别是LaunchActivityItemResumeActivityItem。AMS在ClientTransaction里面添加了一个起始生命周期结束生命周期,那么对应的在我们App进程里面的TransactionExecutor事务处理器里面,也是分两步进行。

qq_42426725的博客 1166
上一篇: Java中hashCode()和equal()方法的使用
下一篇: Java内存模型
罐v子
博客等级 码龄11年 2粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值