【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


目录
相关文章
|
2月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
189 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
5月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
126 1
|
5月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
149 0
|
3月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
117 4
|
6月前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
78 0
|
7月前
|
存储 监控 Java
|
7月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
97 4
|
7月前
|
Java 数据库连接 数据库
当线程中发生异常时的情况分析
【8月更文挑战第22天】
166 4
|
7月前
|
安全 Java 程序员
线程安全与 Vector 类的分析
【8月更文挑战第22天】
113 4
|
6月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。

热门文章

最新文章