【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月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
61 1
|
2月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
81 0
|
22天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
41 4
|
22天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
26天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
94 6
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
31 3
|
2月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
27 3
|
2月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
64 4
|
3月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
150 15
一个Android App最少有几个线程?实现多线程的方式有哪些?