【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 )(二)

简介: 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 )(二)

mService.getLifecycleManager().scheduleTransaction(clientTransaction) 中调用了 ClientLifecycleManager.scheduleTransaction , 在该方法中调用了传入参数 ClientTransaction transaction 的 schedule() 方法 ;


     

// 此处直接调用传入参数的 schedule 方法
        transaction.schedule();



ClientLifecycleManager.scheduleTransaction 方法如下 :


/**
 * 该类能够组合多个客户端生命周期转换请求和/或回调,并将它们作为单个事务执行。
 *
 * @see ClientTransaction
 */
class ClientLifecycleManager {
    /**
     * 安排一个事务,该事务可能包括多个回调和一个生命周期请求。
     * @param transaction 客户端事务项的序列。
     * @throws RemoteException
     *
     * @see ClientTransaction
     */
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        // 此处直接调用传入参数的 schedule 方法
        transaction.schedule();
        if (!(client instanceof Binder)) {
            // 如果客户机不是Binder的实例,则它是一个远程调用,
            // 此时可以安全地回收该对象。
            // 在ActivityThread中的客户端上执行事务后,将回收用于本地调用的所有对象。
            transaction.recycle();
        }
    }
}


完整代码参考

/frameworks/base/services/core/java/com/android/server/am/ClientLifecycleManager.java ;
调用的是 IApplicationThread mClient 成员的 scheduleTransaction 方法 , 该成员类型 IApplicationThread 是 ActivityThread 的内部类 ;
/**
 * 一种容器,它保存一系列消息,这些消息可以发送给客户机。这包括回调列表和最终生命周期状态。
 *
 * @see com.android.server.am.ClientLifecycleManager
 * @see ClientTransactionItem
 * @see ActivityLifecycleItem
 * @hide
 */
public class ClientTransaction implements Parcelable, ObjectPoolItem {
    /** Target client. */
    private IApplicationThread mClient;
    /**
     * 在事务初始化后安排事务。它将发送给客户,其所有单独部分将按以下顺序应用:
     * 1. 客户端调用{@link#preExecute(ClientTransactionHandler)},
     *      这将触发在实际调度回调和生命周期状态请求的事务之前需要完成的所有工作。
     * 2. 已计划事务消息。
     * 3. 客户端调用{@link TransactionExecutor#execute(ClientTransaction)},
     *      它执行所有回调和必要的生命周期转换。
     */
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }
}


完整代码参考 /frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java ;






三、通过 Binder 机制转到 ActivityThread 中执行的操作


通过 Binder 机制 , 调用 ActivityThread 的内部类 IApplicationThread 的 scheduleTransaction 方法 ; 这样就进入到了 ActivityThread 主线程中 , 在该主线程中执行相关源码 ;


/**
 * 它管理应用程序进程中主线程的执行、调度和执行活动、广播以及活动管理器请求的其他操作。
 *
 * {@hide}
 */
public final class ActivityThread extends ClientTransactionHandler {
    private class ApplicationThread extends IApplicationThread.Stub {
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
        }
    }
}


完整代码参考 /frameworks/base/core/java/android/app/ActivityThread.java ;


上述方法最终执行的是 ActivityThread.this.scheduleTransaction(transaction) , ActivityThread 继承了 ClientTransactionHandler 方法 ,


ClientTransactionHandler 中定义的 scheduleTransaction 方法中 , 主要是发出了 ActivityThread.H.EXECUTE_TRANSACTION 159 159159 消息 ;


/**
 * 定义{@link android.app.servertransaction.ClientTransaction}或其项可以在客户端上执行的操作。
 * @hide
 */
public abstract class ClientTransactionHandler {
    // 安排与阶段相关的逻辑和处理程序。
    /** 准备并安排事物执行。 */
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
}


完整代码参考 /frameworks/base/core/java/android/app/ClientTransactionHandler.java ;


总结

本博客分析的源码对应分支 AMS -> ActivityThread ( ApplicationThread ) 分支 , Activity 的热启动 ;

image.png


目录
相关文章
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
292 6
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
323 3
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
297 3
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
486 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
367 4
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
179 0
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
469 0
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
580 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
504 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
896 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章