← 返回文章流

Android源码分析:ClientTransaction分析

分析Android Activity的启动过程,发现Android 在Android9.0中引入了ClientTransaction这一系列的对象,来简化system_server与App进程中处理Activity启动相关的任务。这里就来分析一下。 在服务端(system_server进程)主要有上面这些类,我们首先需要关注的就是ClientTransaction类,这个类在使用的时候主要是有以下几个成员: 1 2 3 4 private List<ClientTransactionItem> mActivityCallbacks; private ActivityLifecycleItem mLifecycleStateRequest; private IApplicationThread mClient; private IBinder mActivityToken; mClient是对应的app的ApplicationThread,他是一个Binder对象,mActivityToken则是Activity的Binder Token,这两个在很多地方都会看到。而mActivityCallbacks为ClientTransactionItem对象,比如说LaunchActivityItem和NewIntentItem这些都是它的子类,同一个ClientTransactionItem中是可以有多个的。mLifecycleStateRequest为ActivityLifecycleItem,它的子类是PauseActivityItem、StopActivityItem这些,每一个是希望Activity执行到的一个状态。相关的类的类图如下: classDiagram class Parcelable <<interface>> Parcelable class BaseClientRequest <<abstract>> BaseClientRequest class ClientTransactionItem <<abstract>> ClientTransactionItem BaseClientRequest <|-- ClientTransactionItem Parcelable <.. ClientTransactionItem BaseClientRequest: void preExecute(ClientTransactionHandler client, IBinder token) BaseClientRequest: void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) BaseClientRequest: void postExecute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) ClientTransactionItem: public int getPostExecutionState() ClientTransactionItem: boolean shouldHaveDefinedPreExecutionState() class ActivityTransactionItem <<abstract>> ActivityTransactionItem ClientTransactionItem <|-- ActivityTransactionItem ActivityTransactionItem: ActivityClientRecord getActivityClientRecord(ClientTransactionHandler client, IBinder token) ActivityTransactionItem <|-- LaunchActivityItem ActivityTransactionItem <|-- NewIntentItem ActivityTransactionItem <|-- ActivityResultItem ActivityTransactionItem <|-- `..` class ActivityLifecycleItem ActivityTransactionItem <|-- ActivityLifecycleItem ActivityLifecycleItem: public abstract int getTargetState() ActivityLifecycleItem <|-- ResumeActivityItem ActivityLifecycleItem <|-- PauseActivityItem ActivityLifecycleItem <|-- StartActivityItem ActivityLifecycleItem <|-- StopActivityItem ActivityLifecycleItem <|-- DestroyActivityItem启动Activity时候的代码调用在ActivityTaskSupervisor这个类的realStartActivityLocked方法中,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 final ClientTransaction clientTransaction = ClientTransaction.obtain( proc.getThread(), r.token); clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), System.identityHashCode(r), r.info, // TODO: Have this take the merged configuration instead of separate global // and override configs. mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat, r.getFilteredReferrer(r.launchedFromPackage), task.voiceInteractor, proc.getReportedProcState(), r.getSavedState(), r.getPersistentSavedState(), results, newIntents, r.takeOptions(), isTransitionForward, proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController, r.shareableActivityToken, r.getLaunchedFromBubble(), fragmentToken)); final ActivityLifecycleItem lifecycleItem; if (andResume) { lifecycleItem = ResumeActivityItem.obtain(isTransitionForward, r.shouldSendCompatFakeFocus()); } else { lifecycleItem = PauseActivityItem.obtain(); } clientTransaction.setLifecycleStateRequest(lifecycleItem); mService.getLifecycleManager().scheduleTransaction(clientTransaction); 从上面的代码我们看到ClientTransaction以及其他的一些使用到的比较多的对象,Android系统中都做了对象池,内部基本上都是数组维护,我们这里不分析了。 启动Activity就是创建了一个LaunchActivityItem并且设置了对应的LifecycleStateRequest,最后是通过LifecycleManager调用scheduleTransaction来执行。这里的mService为ActivityTaskManagerService的实例,lifecycleManager为ClientLifecycleManager的实例,方法代码如下: 1 2 3 4 5 6 7 void scheduleTransaction(ClientTransaction transaction) throws RemoteException { final IApplicationThread client = transaction.getClient(); transaction.schedule(); if (!(client instanceof Binder)) { transaction.recycle(); } } 这里ClientTransaction会获取Client,也就是IApplicationThread,system_server这一端是ApplicationThread的客户端,因此schedule和recycle方法都会执行。主要看一下schedule方法: 1 2 3 public void schedule() throws RemoteException { mClient.scheduleTransaction(this); } 又调用了Client的scheduleTransaction方法,参数为我们的ClientTransaction方法,这是在客户端调用,那我们需要去服务端看这个方法的执行,实现也就是在ApplicationThread类当中。 1 2 3 public void scheduleTransaction(ClientTransaction transaction) throws RemoteException { ActivityThread.this.scheduleTransaction(transaction); } ActivityThread是ClientTransactionHandler的子类,这个scheduleTransaction就在ClientTransaction当中,代码如下: 1 2 3 4 5 void scheduleTransaction(ClientTransaction transaction) { transaction.preExecute(this); sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); } 其中的preExecute方法就是直接调用了,内部实现就是分别调用所有的activityCallback的preExecute方法,以及mLifecycleStateRequest的preExecute方法,而execute没有直接调用,而是通过消息发出去了,实现就是ActivityThread的sendMessage,我们也都知道是用它的H这个Handler,可以在它的handleMessage中找到如下代码: 1 2 3 4 5 6 case EXECUTE_TRANSACTION: final ClientTransaction

来自 码农明明桑作者主页
在原博客阅读全文 (新标签页打开)

以上内容来自博客订阅源,版权归原作者。关注作者后可以在 关注列表 第一时间查看作者文章。

一起聊聊 0

尊重不同观点

还没有评论。欢迎分享第一个想法。

RSS SUBSCRIPTIONS

选择 RSS 订阅

把博客汇的文章添加到你常用的阅读器。

关注文章 RSS 订阅本订阅需要登录后使用