源码解析之Activity的启动流程

Android Activity启动流程源码全解析(2) 接上之前的分析++Android Activity启动流程源码全解析(1)++ 阅读详情

Activity的启动在我们的Android学习中随处可见,但是它的原理是如何运行的,我相信知道的人并不是很多。
此篇,让我们一起去见证Activity启动之美。

Activity的两种启动流程分别是:

  1. 点击Launcher启动新的Activity。
  2. 正在运行的app的Activity,即启动子Activity。

区别:launcher本身就是一个应用,当我们点击图标的时候,系统会调用startActivitySately(),一般情况下我们所启动activity相关信息都保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackManagerSrevice的管理服务,这个管理服务会对AndroidManfest.xml文件进行解析,从而得到应用程序中相关信息。

后边startactivity的启动流程是一致的。

下边一张图片让我们了解Activity的整个启动流程。
图片来自一张图搞定,Activity的启动流程
在这里插入图片描述
源码基于API28 (Aandroid 9.0)

LauncherActivity

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Intent intent = intentForPosition(position);
        startActivity(intent);
    }

当我们点击Launcher的时候,它调用了startActivity(),但是它的底层调用了startActivityForResult()。

/**
     * Same as {@link #startActivity(Intent, Bundle)} with no options
     * specified.
     *
     * @param intent The intent to start.
     *
     * @throws android.content.ActivityNotFoundException
     *
     * @see #startActivity(Intent, Bundle)
     * @see #startActivityForResult
     */
    @Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }

    /**
     * @see #startActivity(Intent)
     * @see #startActivityForResult
     */
    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }

由于是首次启动Activity,所以这里的mParent为null,所以会调用Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity()。
Instrumentation又叫仪表盘,负责调用Activity和Application生命周期。

 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            if (ar != null) {
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            }
            if (requestCode >= 0) {
                // If this start is requesting a result, we can avoid making
                // the activity visible until the result is received.  Setting
                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
                // activity hidden during this time, to avoid flickering.
                // This can only be done when a result is requested because
                // that guarantees we will get information back when the
                // activity is finished, no matter what happens to it.
                mStartedActivity = true;
            }

            cancelInputsAndStartExitTransition(options);
            // TODO Consider clearing/flushing other event sources and events for child windows.
        } else {
            if (options != null) {
                mParent.startActivityFromChild(this, intent, requestCode, options);
            } else {
                // Note we want to go through this method for compatibility with
                // existing applications that may have overridden it.
                mParent.startActivityFromChild(this, intent, requestCode);
            }
        }
    }

在execStartActivity中,会调用 int result = ActivityManager.getService()
.startActivity(),之后会调用checkStartActivityResult(int res, Object intent)

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);
        }
        if (mActivityMonitors != null) {
            synchronized (mSync) {
                final int N = mActivityMonitors.size();
                for (int i=0; i<N; i++) {
                    final ActivityMonitor am = mActivityMonitors.get(i);
                    ActivityResult result = null;
                    if (am.ignoreMatchingSpecificIntents()) {
                        result = am.onStartActivity(intent);
                    }
                    if (result != null) {
                        am.mHits++;
                        return result;
                    } else if (am.match(who, null, intent)) {
                        am.mHits++;
                        if (am.isBlocking()) {
                            return requestCode >= 0 ? am.getResult() : null;
                        }
                        break;
                    }
                }
            }
        }
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            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;
    }
if (requestCode >= 0) {
            // If this start is requesting a result, we can avoid making
            // the activity visible until the result is received.  Setting
            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
            // activity hidden during this time, to avoid flickering.
            // This can only be done when a result is requested because
            // that guarantees we will get information back when the
            // activity is finished, no matter what happens to it.
            mStartedActivity = true;
        }

这时我们看到,只有调用startActivityForResult的时候,只有requestCode的值大于等于0,onActivityResult才会被回调。

/**
     * @hide
     */
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

这里用到了Binder机制,在Android系统的Binder机制中,是有Client,Service,ServiceManager,Binder驱动程序组成的,其中Client,service,Service Manager运行在用户空间,Binder驱动程序是运行在内核空间的。而Binder就是把这4种组件粘合在一块的粘合剂,其中核心的组件就是Binder驱动程序,Service Manager提供辅助管理的功能,而Client和Service正是在Binder驱动程序和Service Manager提供的基础设施上实现C/S 之间的通信。其中Binder驱动程序提供设备文件/dev/binder与用户控件进行交互,

Client、Service,Service Manager通过open和ioctl文件操作相应的方法与Binder驱动程序进行通信。而Client和Service之间的进程间通信是通过Binder驱动程序间接实现的。而Binder Manager是一个守护进程,用来管理Service,并向Client提供查询Service接口的能力。这里使用的是AIDL跨进程通信方式。复习Android之Service的AIDL传值
接下里就会走

ActivityManagerService.startActivity() 
ActvityiManagerService.startActivityAsUser() 

ActivityStarter.startActivityMayWait() 
ActivityStarter.startActivityLocked() 
ActivityStarter.startActivity() 
ActivityStarter.startActivityUncheckedLocked() 

ActivityStackSupervisor.resumFocusedStackeTopActivitiyLocked() 
ActivityStackSupervisor.specificActivityLocked() 
ActivityStackSupervisor.realStartActivityLocked() 

ActivityStackr.resumeTopActivityUncheckedLocked() 
ActivityStackr.resumeTopActivityInnerLocked() 

ActivityStackSupervisor.IApplicationThread.scheduleLaunchActivity 

ActivityThread
ApplictionThread.scheduleLaunchActivity
ActivityThread.sendMassage
......
UI.handleMessage
handleLaunchActivity
newActivity
Android Activity的启动流程源码解析(8.0) 一,写在前面        Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程。用户启动Activity的方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面;另一种是在应用程序中,进入一个新的Activity。前者,桌面其实是系统应用launcher的界面,点击应用程序图标,会进行应用程序的主界面,实质是从一个应用的A 阅读详情

相关推荐

Android Activity 源码解析与启动流程

本文通过分析 Activity 的源码和启动流程,详细介绍了 Activity 类的结构和生命周期方法,并解释了 startActivity() 方法的原理和 startActivityForResult() 方法的用法。为了深入理解 Activity 的工作原理,我们将分析 Activity 的源码,并详细说明 Activity 的启动流程。当我们调用 startActivity() 方法启动一个新的 Activity 时,系统会按照一定的流程完成 Activity 的创建和启动。

2301_79326891的博客 454

Activity启动源码分析

Launcher 1,startActivitySafely 2,startActivity(Intent=FLAG_ACTIVITY_NEW_TASK 表示要在一个新的Task中启动这个Activity) startActivitySafely(intent, opts.toBundle()); public class Launcher { public static void main(String[] args) Acti...

疾风剑豪 272

企业和个人 AI 编程工具怎么选?2025 年 12 款主流工具(Claude/Cursor 等)核心能力 + 收费对比

2025 年最火的 12 款 AI 编程工具,像 Claude、Cursor 这些热门款,我把它们的核心能力、收费标准全扒得明明白白,看完这篇你不用再瞎琢磨,直接就能挑到对的!再说说 Cursor,美国 Cursor Labs 做的,还拿过红杉资本投资,2022 年推出后,2024 年收入直接涨了 6400%,势头很猛。总之,不管你是企业技术管理者、程序员,还是刚入门的 AI 小白,按自己的需求(语言、合规、预算)挑,保准能找到最适合的 AI 编程工具!最后给大家划重点,不同需求直接对号入座:?

hundred98的博客 2801

Activity 的启动流程(Android 13)

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

xingyu19911016的博客 2万+

langchain4j+milvus实战

本文主要研究一下如何使用langchain4j来对接向量数据库milvus。

go4it 1474

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1593

Android集合和数据的相互转换

如有需要可以把String换成其他类。

UrasakiNakajima的博客 870

IGCT 测试原理概述

IGCT(Integrated Gate-Commutated Thyristor,集成门极换流晶闸管)是一种高功率半导体器件,基于门极可关断晶闸管(GTO)的原理,但通过集成门极驱动单元和优化结构(如硬驱动技术),实现了更低的导通损耗、更快的开关速度和更高的可靠性。它适用于中高压大功率应用,如高压直流输电(HVDC)、中压变频器和模块化多电平变换器(MMC)。IGCT 的结构为四层 p-n-p-n 器件,门极电流控制导通和关断,阳极电流在关断时快速换流至门极,通常在 1 μs 内完成。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 238

Activity启动过程详解(Android 12源码分析)

activity启动流程

yangfengxiao的专栏 6万+

华为OD机考 新系统真题 【区分奇偶的数组排序】

华为OD机试 新系统真题【区分奇偶的数组排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【区分奇偶的数组排序】多语言题解。

qq_45776114的博客 515

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

以河东地区为例,介绍CMIP6数据下载及处理

WW、forever的博客 4951

Activity启动流程

Activity启动流程详解

k663514387的博客 2496

时空智友企业信息管理系统任意文件读取漏洞复现

时空智友企业信息管理系统是一个用于企业流程管理和控制的软件系统。它旨在帮助企业实现流程的规范化、自动化和优化,从而提高工作效率、降低成本并提升管理水平。时空智友企业信息管理系统存在任意文件读取漏洞,攻击者可以在未授权的情况下读取系统上的文件。没有人规定,一朵花一定要成长为向日葵或者玫瑰。

The current road is different, love needs to distinguish between right and wrong 971

Android Activity启动流程源码解析

在 Android Launcher启动应用程序流程源码解析一文中从点击应用程序图标startActivity()开始,一直讲解到Application和MainActivity的onCreate()方法被调用。中间流程有些高能,高能部分是两篇博文共有的地方,没办法绕开。本文主要讲述从Activity#onCreate()到Activity#onResume()的流程。想追本溯源的同学建议先阅读

一口仨馍 4428

YOLOv8改进 | 注意力篇 | YOLOv8引入EMAttention(EMA)注意力

具体来说,除了对全局信息进行编码以重新校准每个并行分支中的通道权重之外,还通过跨维度交互来进一步聚合两个并行分支的输出特征,以捕获像素级的成对关系。3. 跨空间学习:除了在每个并行子网络中建立局部的跨通道交互外,EMA模块还通过跨空间学习方法融合了两个并行子网络的输出特征图。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv8改进有效涨点专栏,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 896

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android组件Activity的启动流程源码解析

然后根据Activity的信息,创建一个Activity对象,并调用它的onCreate()方法。通过以上分析,我们可以看出,Activity的启动流程非常复杂,涉及到多个系统组件和类的协同工作。在AMS的startActivity()方法中,首先通过resolveActivity()方法找到要启动的Activity的信息。在Activity的启动过程中,Intent主要用来传递Activity的信息。在这个构造方法中,我们传入了要启动的Activity的类名和所属的包名。下面我们逐一解析这个过程。

m0_59690208的博客 815

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android源码探究:Activity启动流程完全解析

概述 本文主要内容是从源码角度进行Activity启动流程的分析。由于整个启动的过程非常长并且代码非常多,同时受限于笔者的水平,所以本文不会细致到解释每一行的代码的具体作用,只能抽取处关键部分的代码就主体流程进行分析,如有错误之处,希望批评指出。 行文脉络 由于本文会非常长,为了方便读者的理解,首先给出笔者的行文脉络。本文主要沿着:在应用程序1的Activity A内打开另一个应用程序2的Acti...

蓝天白云梦的csdn博客 1873

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Activity的启动流程源码解析

一、应用内启动 我们平时启动一个activity一般都是调用startActivity方法,接下来就看看startActivity方法具体为我们执行了哪些流程去帮我们启动一个activity吧。 1.先简单的看一下调用关系时序图(基于android28源码) 我知道你可能看不清,点击链接查看时序图 2.源码分析 Activity.java @Override public void startActivity(Intent intent) { thi.

wozuihaole的博客 697

Android系统源码解析:Activity启动流程中的Binder跨进程通信机制

Binder是Android系统特有的IPC机制,它实现了高效的进程间通信,同时保持了面向对象的编程风格。与传统的管道、Socket等IPC方式相比,Binder具有以下特点:基于内存映射的高效数据传输支持面向对象的调用方式内置权限验证机制支持同步和异步调用通过对Activity启动流程中Binder IPC机制的源码解析,我们可以看到Android系统如何通过Binder实现高效的跨进程通信。进程隔离:提高系统安全性和稳定性组件化:支持灵活的组件架构资源共享:进程间可以高效共享数据和功能。

weixin_65409651的博客 741

Activity启动流程和源码解析

↓双击 Markdown插件,就可以开始编辑啦。 APP进程 ActivityThread的启动 public static void main(String[] args) { ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); } 在attach方法...

我想要台时光机 485

进程启动后到加载Activity的流程源码解析(基于安卓版本28)

zygote进程fork之后,系统会 启动ActivityThread的入口函数main()。ActivityThread准备一个ApplicationThread类,用于和AMS进行通讯。Activity与AMS通讯时通过binder机制进行的。

陈德山 1534

Activity启动流程和启动模式源码解析

Acticity启动流程 1、根启动的流程:从桌面点击图标,到启动Activity的页面 Activity启动之前 init进程->Zygote进程->SystemService进程和Launcher进程 Launcher的定义:Android系统启动后,加载的第一个程序,是其他应用程序的入口。可以看成是整个桌面UI Launcher的源码?????? 注:需要写一个Launcher的源码,来进行源码分析 2、普通Activity的启动流程 注:Android源码读取不到:1)编译版本

qq_32035241的博客 571

Android Activity启动流程源码全解析(1)

前言Activity是Android四大组件的老大,我们对它的生命周期方法调用顺序都烂熟于心了,可是这些生命周期方法到底是怎么调用的呢?在启动它的时候会用到startActivty这个方法,但是这个方法的背后是怎样来实现的呢,来看看源码一探究竟(API23,无关代码省略)

梦里梦到醒不来的梦 1387
上一篇: Android Studio如何让工具栏返回到左边
下一篇: java中byte、 int、char、long、float、double各占多少字节数?
jhonjson
博客等级 码龄11年 220粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值