您当前的位置: 首页 >  android

韩曙亮

暂无认证

  • 2浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

韩曙亮 发布时间:2021-09-13 11:14:16 ,浏览量:2

文章目录
  • 前言
  • 一、ClientTransactionHandler.scheduleTransaction
  • 二、ActivityThread.H 处理 EXECUTE_TRANSACTION 消息
  • 三、TransactionExecutor execute -> executeCallbacks 方法
  • 四、LaunchActivityItem.execute
  • 总结

前言

上一篇博客 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 ) 分析到 , 在 AMS 进程通过 Binder 机制调用 ActivityThread 中的 ApplicationThread 内部类中 scheduleTransaction 方法 ;

在该方法中 , 发送了 ActivityThread.H.EXECUTE_TRANSACTION 159 159 159 消息 , 由 ActivityThread 中的内部类 H 处理该消息 ;

从 Binder 调用 ActivityThread 开始 , 就进入了主线程阶段开始执行 , 这里开始在主线程中创建 Activity , 并启动该 Activity ;

一、ClientTransactionHandler.scheduleTransaction

ClientTransactionHandler.scheduleTransaction 方法中 , 发送了 159 159 159 消息 , 并且将参数 ClientTransaction transaction 传递给了 ActivityThread.H ;

/**
 * 定义{@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 ;

二、ActivityThread.H 处理 EXECUTE_TRANSACTION 消息

在 ActivityThread 的 H 内部类中 , 处理 int EXECUTE_TRANSACTION = 159 消息时 , 获取传入的 ClientTransaction transaction 对象 , 并执行该事务 mTransactionExecutor.execute(transaction) ;

mTransactionExecutor 是 ActivityThread 成员变量 , 是执行多步骤事务的执行者 ;

/**
 * 它管理应用程序进程中主线程的执行、调度和执行活动、广播以及活动管理器请求的其他操作。
 *
 * {@hide}
 */
public final class ActivityThread extends ClientTransactionHandler {

    // 执行多步骤事务的执行者。
    private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);

    class H extends Handler {
        public static final int EXECUTE_TRANSACTION = 159;
	
        public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case EXECUTE_TRANSACTION:
                	// ActivityThread 调用 scheduleTransaction 方法发送 159 消息时
                	// 将 transaction 传递到了 H 中
                	// 此处获取该 transaction 
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    // 执行 transaction 相关信息 
                    mTransactionExecutor.execute(transaction);
                    if (isSystem()) {
                        // 系统进程内的客户端事务在客户端而不是ClientLifecycleManager上循环,
                        // 以避免在处理此消息之前被清除。
                        transaction.recycle();
                    }
                    // TODO(lifecycler): 回收本地计划的事务。
                    break;
            }
            Object obj = msg.obj;
            if (obj instanceof SomeArgs) {
                ((SomeArgs) obj).recycle();
            }
            if (DEBUG_MESSAGES) Slog.v(TAG, "            
关注
打赏
1663594092
查看更多评论
0.0453s