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

本文详细解析了Android系统中Activity启动的流程,从ActivityTaskManagerService开始,经由ActivityStarter,直到ApplicationThread。重点介绍了startActivity()的不同方法,ActivityRecord的创建,以及如何通过Binder通信在不同进程间传递启动指令。
摘要由CSDN通过智能技术生成

Activity的启动一般分为普通Activity的启动,根Activity的启动.而根Activity是指应用启动的第一个Activity过程,所以也可以理解为应用的启动过程.

相关内容链接:android系统启动流程

Activity的启动流程大致分为如下四个阶段:

一.应用进程(Launcher)调用ATMS系统进程的过程

二.ActivityTaskManagerService到ApplicationThread的调用过程

三.AMS向Zygote发送启动应用进程的过程

四.ActivityThread启动Activity的过程

Activity启动过程涉及到进程之间的关系:

二.ActivityTaskManagerService到ApplicationThread的调用过程

类名: com.android.server.wm.ActivityTaskManagerService:

1. startActivity(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle)

startActivity和startActivityAsUser的区别仅在于方法多了一个参数UserHandle.getCallingUserId(),该方法会获取调用者的UserId,ATMS可以根据这个UserId来确定调用者的权限. 最后通过getActivityStartController().obtainStarter(intent, "startActivityAsUser")来获取ActivityStarter对象,调用ActivityStarter的execute()方法继续执行启动流程.

2. startActivityAsUser(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle, int)

3. startActivityAsUser(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle, int, boolean)

    // android-29\com\android\server\wm\ActivityTaskManagerService.java
    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) {
        // 判断调用者进程是否被隔离,如果isIsolated则抛出SecurityException异常
        enforceNotIsolatedCaller("startActivityAsUser");
        // 检查调用者权限
        userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

        // TODO: Switch to user app stacks here.
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId)
                .execute();
    }

类名: com.android.server.wm.ActivityStarter:

ActivityStarter是Android7.0中新增的类,它是用来加载Activity的控制类

4. execute()

5. startActivityMayWait()

这里主要是调用resolveActivity()来获取需要启动的activity信息,得到activity信息后继续调用startActivity()方法来继续启动Activity.

6. startActivity(IApplicationThread, Intent, Intent, String, .ActivityInfo, ResolveInfo, IVoiceInteractionSession, IVoiceInteractor, IBinder, String, int, int, int, String, int, int, int, SafeActivityOptions, boolean, boolean, ActivityRecord[], TaskRecord, String, boolean, PendingIntentRecord, boolean)

7. startActivity(IApplicationThread, Intent, Intent, String, ActivityInfo, ResolveInfo, IVoiceInteractionSession, IVoiceInteractor, IBinder, String, int, int, int, String, int, int, int, SafeActivityOptions, boolean, boolean, ActivityRecord[], TaskRecord, boolean, PendingIntentRecord, boolean)

这里首先会进行一系列错误检查,然后创建了ActivityRecord,随后获取当前具有用户输入焦点的ActivityStack. ActivityRecord记录了activity的所有信息,而ActivityStack是对这些activity以及activity任务栈进行管理

// android-29/com/androi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值