ActivityManagerService框架粗略分析

本文概述了Android的ActivityManagerService(AMS)框架,从Launcher启动应用开始,详细阐述了AMS如何创建进程、管理应用启动及四大组件。涉及到的关键组件包括Instrumentation、ActivityManager、ActivityStackSupervisor和Zygote。通过理解AMS与ActivityThread、ApplicationThread、binder通讯过程,揭示了Android应用程序启动的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。Android应用各个组件都是通过AMS调度,Android进程也是AMS创建,Android应用程序启动之前先启动进程,然后启动对应的Activity

AMS框架

从Launcher开始

应用启动可以通过adb启动,可以通过其他应用启动(包括Launcher),也可以通过监听广播启动。一般启动一个Android应用都是从Launcher开始,通过点击桌面图标启动一个应用程序。

在这里插入图片描述

  1. 点击Launcher启动图标,执行Activity的startActivityForResults

Activity.java

   public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {    
    ...
    Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);...
    ...
    }
  1. startActivityForResults中Instrumentation对象执行execStartActivity,其中注意mMainThread.getApplicationThread()这个参数,这个是所启动这个Activity应用里面的ApplicationThread,继承IApplicationThread.Stub,显然这是一个用于跨进程通讯的类.其中ApplicationThread是服务端,它传输到AMS,那么AMS对于ApplicationThread就是客户端.因为Binder是客户服务模式,只能从客户端主动请求,传入对于binder到AMS客户让AMS能够主动与应用交互,
  2. execStartActivity中通过ActivityManger与ActivityManagerService跨进程通讯

Instrumentation.java

    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, String resultWho,
            Intent intent, int requestCode, Bundle options, UserHandle user) {
        IApplicationThread whoThread = (IApplicationThread) contextThread; //1
       ...
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            int result = ActivityManager.getService() //2
                .startActivityAsUser(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, resultWho,
                        requestCode, 0, null, options, user.getIdentifier());
            check
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值