Activity 启动流程

本文详细剖析了Android 5.0中Activity的启动过程,从startActivity开始,经过Instrumentation、ActivityManagerNative、ActivityManagerService(AMS)、ActivityStackSupervisor、ActivityStack等多个关键组件,最终如何通过Binder机制在主线程中创建并执行Activity的OnCreate方法。同时,强调了Handler在跨线程通信中的作用,以及IApplicationThread接口在接收服务端消息启动Activity过程中的关键角色。
摘要由CSDN通过智能技术生成
Activity 启动调用流程 (基于5.0源码)

我们从 startActivity 开始:

startActivity()

startActivity()方法有多个重载,但是都会调用到 startActivityResult:

 public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (mParent == null) {
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            ... //
         }
         ...// 省略大量代码
}

Ok,我们可以看到 调用到了 Instrumentation 的 execStartActivity 方法。

下面我们看一下 execStartActivity 中的两行重点代码:

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

可以看到,调用到了 ActivityManagerNative.getDefault() 的 startActivity。 而getDefault()返回的是一个 IActivityManager.

checkStartActivityResult()是校验activity 的启动结果的,比如我们没有在androidManifest 注册,等等。就会抛出异常。

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };

可以看到是一个单例。IActivityManager 是一个 Binder 接口

public interface IActivityManager extends IInterface {
   
    ...// 方法
}

而该Binder 的真正实现 是 ActivityManagerService(简称 AMS) 。 所以接下来我们来看 AMS 中的 startActivity实现

 @Override
    public final int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle options) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, options,
            UserHandle.getCallingUserId());
    }

啥实事也没干,直接转调了 startActivityAsUser 继续跟进,

 @Override
    public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值