Activity概述

Post on Aug 02, 2022 by Wei Lin

概述

根Activity启动

Activity的启动过程分为两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。

  • 根Activity:指的是应用程序启动的第一个Activity,因此根Activity的启动过程一般情况下也可以理解为应用程序的启动过程。
  • 普通Activity:指的是除应用程序启动的第一个Activity之外的其他Activity。

根Activity的启动流程更加复杂,以下为根Activity的启动,以进程为单位的调用图(图片来自于其它博客)。

Activity概述1.png

Launcher说明

Launcher,也就是我们平时所说的”桌面”,本质上与其他Android应用一样,都是APK应用程序,可以独立安装运行,我们平常使用的系统Launcher都是手机厂商定制后预制到系统里面的。


Launcher 启动后会将已安装应用程序的快捷图标显示到桌面上,这些应用程序的快捷图标就是启动根Activity的入口,当我们点击某个应用程序的快捷图标时,就会通过Launcher请求AMS来启动该应用程序。


当我们点击应用程序的快捷图标时,就会调用Launcher的startActivity()方法,之后就是Activity的启动流程。

Activity调试关键点

了解Activity的生命周期变化过程,只要跟踪关键节点即可,不必拘泥于了解每个函数,每个变量的作用(因为实在太多)。可以通过以下关键日志及对象了解Activity的生命周期。


(1) 日志

关键日志包括START u0和wm_xxx日志,通过跟踪这些日志以及它们之间的打印顺序以了解生命周期执行过程


(2) 事务-ClientTransaction对象

Activity是根据ClientTransaction对象执行生命周期的,需要执行的生命周期以及相关回调都包含在ClientTransaction对象中,而该对象在system端创建,并通过Binder传递到APP端并由APP端执行。

ClientTransaction.java
/** Target client. */
private IApplicationThread mClient;
// 调用到APP端
public void schedule() throws RemoteException {
    mClient.scheduleTransaction(this);
}

可以通过跟踪ClientTransaction对象的生成及执行情况来了解Activity的生命周期变化过程。


(3) ActivityRecord对象的状态

每一个Activity在system_server中都有一个ActivityRecord对象,其包含一个State mState属性,有如下取值:

enum State {
    INITIALIZING,
    STARTED,
    RESUMED,
    PAUSING,
    PAUSED,
    STOPPING,
    STOPPED,
    FINISHING,
    DESTROYING,
    DESTROYED,
    RESTARTING_PROCESS
}

每次Activity的生命周期有变化时,都会通过ActivityRecord.setState(State state, String reason)标识Activity的当前状态,因此调试时可以跟踪Activity的mState情况了解Activity的生命周期变化过程。

相关类

Activity相关类概述

Base on: Android 13

Branch: android-13.0.0_r30

类名 作用
Activity 写APP时常用的Activity
ActivityManagerService Android核心服务,负责四大组件的启动,切换,调度等工作。
ActivityStarter 开启Activity的控制器,其作用为启动新的Activity、设置Intent附加数据、处理Activity的返回结果等
ActivityStackSupervisor 其主要作用为管理Activity堆栈、处理Activity的启动和切换、处理Activity的生命周期、Activity的Task管理、Activity的堆栈调整等
ActivityTaskManager Activity,Service等与ATMS跨进程交互的接口
ActivityTaskManagerService 管理Activity行为,控制Activity的生命周期
   
ActivityThread 管理应用程序进程的主线程的执行,处理ATMS的调度和执行Activity,Broadcast及相关操作。
ApplicationThread 它是ActivityThread的一个内部类,继承IApplicationThread.Stub,是一个IBinder,是ActiivtyThread与ASM通信的桥梁。
ClientLifecycleManager 多个客户端生命周期执行请求管理
ClientTransaction 封装了客户端请求的一些信息,比如要调用的方法、参数等,然后通过 Binder 发送到服务端
Intrumentation 负责调用Activity和Application生命周期
RootWindowContainer RootWindowContainer是一个用于管理窗口的类。它的作用是跟踪所有窗口的状态,并负责将它们显示在屏幕上
TransactionExecutor 用于处理界面更新事务的类。它的作用是在主线程上处理界面更新请求,以确保所有更新操作都在 UI 线程上执行
   

简写:

ActivityManagerService AMS

ActivityTaskManager ATM

ActivityTaskManagerService ATMS

ActivityRecord

Base on: Android 13

​ ActivityRecord记录了Activity的所有信息,因此它用来描述一个Activity。它是在Activity启动时被创建的,具体是在ActivityStarter的startActivity()中被创建的。它存储的信息主要包括以下内容:

属性 说明
ActivityTaskManagerService mAtmService ATMS的引用
ActivityInfo info Activity中代码和AndroidManifest设置的节点信息
String packageName 启动Activity的包名
String taskAffinity Activity所属Task
   

Task

Base on: Android 13

​ Task用来描述一个Activity任务栈,并且管理和控制任务栈中的 Activity。它提供了对任务栈的操作和状态的访问,以及对任务栈的创建、切换、销毁和恢复等操作的支持。

属性 说明
int mTaskId 任务栈的唯一标识符
String affinity The affinity name for this task
Intent intent The original intent that started the task

跨进程传递类

Base on: Android 13

Branch: android-13.0.0_r30

TransactionExecutor

TransactionExecutor类是 Android 中的一个关键类,它用于执行和处理Binder事务。Binder是 Android 中用于实现跨进程通信的机制,而TransactionExecutor则负责处理和执行这些跨进程通信的请求。

具体来说,TransactionExecutor类的主要作用如下:

注:TransactionExecutor调度的事务实际上是一个ClientTransaction对象。


(1) 执行 Binder 事务

TransactionExecutor接收来自其他进程的Binder事务请求,并负责执行这些事务。它将根据事务的类型和目标对象,调用相应的方法来处理事务。


(2) 调度事务执行

TransactionExecutor维护一个线程池,用于调度和执行事务。它可以根据需求控制并发执行的线程数量,并提供了一些方法来管理和监控事务的执行。


(3) 管理事务的生命周期

TransactionExecutor负责管理事务的生命周期,包括事务的创建、执行和销毁。它会跟踪每个事务的状态,并在事务完成后进行清理和释放资源。


(4) 处理异常情况

TransactionExecutor会处理事务执行过程中可能出现的异常情况,如超时、连接断开等。它会根据具体的情况采取相应的处理措施,如重试、回滚等。


(5) 总结

​ 总体而言,TransactionExecutor类在 Android 中起着关键的作用,它是实现跨进程通信的重要组件之一。通过该类,Android 系统可以高效地处理和执行跨进程通信的请求,保证了应用程序之间的正常交互和通信。


ClientTransaction

Base on: Android 13

ClientTransaction类用于管理和执行客户端事务。它在应用程序与系统服务之间进行通信,以执行各种操作和请求。

它是应用程序与系统服务之间通信和交互的桥梁。通过该类,应用程序可以向系统服务发送各种操作和请求,实现不同功能和功能模块的交互和协作。


具体来说,ClientTransaction类的主要功能如下:

(1) 封装事务操作

ClientTransaction封装了一系列的操作或请求,以便在应用程序和系统服务之间进行传递和执行。它可以包含多个子事务,每个子事务都代表了一个具体的操作。


(2) 调度事务执行

ClientTransaction通过调用ClientTransactionHandler的方法来执行事务。系统服务会接收到ClientTransaction对象,并根据其中的操作和请求,执行相应的处理逻辑。


(3) 管理事务的生命周期

ClientTransaction负责管理事务的生命周期,包括事务的创建、执行和销毁。它会跟踪每个事务的状态,并在事务完成后进行清理和释放资源。


(4) 处理事务的并发性

ClientTransaction可以同时处理多个事务,它使用了线程池来管理并发执行的事务。这样可以提高系统的效率和性能,同时确保多个事务之间的正确执行顺序。


(5) 处理事务回调

ClientTransaction可以注册和触发事务回调,用于在事务执行过程中进行通知和处理。应用程序可以根据需要注册回调,以便在事务执行完成或出现异常时进行相应的操作


(6) ClientTransaction中的常用属性和方法

方法 说明
List mActivityCallbacks APP端需要执行的回调方法
ActivityLifecycleItem mLifecycleStateRequest APP端最后的生命周期状态,最后被执行
IApplicationThread mClient APP端线程
IBinder mActivityToken 目标Activity
   
addCallback() 添加APP端需要执行的回调
preExecute() 最先执行的方法
schedule() 调用到APP端
obtain() 通过参数创建一个ClientTransaction对象

ClientTransactionItem

ClientTransactionItem表示一个APP端可以执行的回调对象,可以Binder传输。

public abstract class ClientTransactionItem implements BaseClientRequest, Parcelable {

    /** Get the state that must follow this callback. */
    @LifecycleState
    public int getPostExecutionState() {
        return UNDEFINED;
    }


    // Parcelable

    @Override
    public int describeContents() {
        return 0;
    }
}

(1) 其子类包括

public abstract class ActivityTransactionItem extends ClientTransactionItem {...}
public class BoundsCompatInfoChangeItem extends ClientTransactionItem {...}
public class ConfigurationChangeItem extends ClientTransactionItem {...}
public class LaunchActivityItem extends ClientTransactionItem {...}

其中ActivityLifecycleItem是一个表示Activity生命周期的类。它用于在跨进程记录和管理活动的生命周期状态,并在APP中执行相关生命周期方法。

(2) ActivityTransactionItem的子类

public class ActivityConfigurationChangeItem extends ActivityTransactionItem {...}
public abstract class ActivityLifecycleItem extends ActivityTransactionItem {...}
public class ActivityRelaunchItem extends ActivityTransactionItem {...}
public class ActivityResultItem extends ActivityTransactionItem {...}
public final class EnterPipRequestedItem extends ActivityTransactionItem {...}
public class MoveToDisplayItem extends ActivityTransactionItem {...}
public class NewIntentItem extends ActivityTransactionItem {...}
public final class PipStateTransactionItem extends ActivityTransactionItem {...}
public class TopResumedActivityChangeItem extends ActivityTransactionItem {...}
public class TransferSplashScreenViewStateItem extends ActivityTransactionItem {...}

(3) ActivityLifecycleItem的子类

public class DestroyActivityItem extends ActivityLifecycleItem {...}
public class PauseActivityItem extends ActivityLifecycleItem {...}
public class ResumeActivityItem extends ActivityLifecycleItem {...}
public class StartActivityItem extends ActivityLifecycleItem {...}
public class StopActivityItem extends ActivityLifecycleItem {...}

ActivityLifecycleItem

在 Android 中,ActivityLifecycleItem是一个表示Activity生命周期的类。它用于在ActivityThread中记录和管理活动的生命周期状态。


ActivityLifecycleItem类的主要作用是存储和传递Activity的生命周期信息。每个Activity在其生命周期的不同阶段,都会生成相应的ActivityLifecycleItem对象,并通过ActivityThread进行处理。


以下是ActivityLifecycleItem类的一些主要功能和作用:

(1) 记录Activity生命周期状态

ActivityLifecycleItem对象可以记录Activity的生命周期状态,如创建(onCreate)、启动(onStart)、恢复(onResume)、暂停(onPause)、停止(onStop)和销毁(onDestroy)等。


(2) 传递生命周期事件

ActivityLifecycleItem对象可以在ActivityThread中传递生命周期事件。当Activity的生命周期状态发生变化时,将会创建相应的ActivityLifecycleItem对象,并将其传递给ActivityThread进行处理。


(3) 执行生命周期回调

ActivityThread在接收到ActivityLifecycleItem对象后,会调用Activity的相应生命周期回调方法,如onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等。这样,活动就能够在适当的时机执行相应的操作和逻辑。


(4) 总结

通过使用ActivityLifecycleItem类,Android 系统能够准确地跟踪和管理Activity的生命周期,以便在合适的时机调用相应的生命周期回调方法,并确保Activity的正确运行和状态管理。

事务传递过程

设计模式:命令模式,即将一个请求封装为一个对象,从而可以在客户端使用同一代码或流程执行不同的请求,Activity生命周期变化过程中,system就是将其封装为ClientTransaction对象,使该对象作为一个请求,然后由APP端执行。

以执行onResume()为例。

system端-生成事务

不同的生命周期创建不同的事务,如NewIntentItem、ActivityRelaunchItem等,所有这些事务都是ClientTransaction的子类,并且都实现了Parcelable接口,所以都是可以序列化并跨进程Binder传递的。

在ActivityRecord.scheduleTopResumedActivityChanged()中生成TopResumedActivityChangeItem,表示一个resume事务。

boolean scheduleTopResumedActivityChanged(boolean onTop) {
    if (!attachedToProcess()) {
        ProtoLog.w(WM_DEBUG_STATES,
                "Can't report activity position update - client not running, "
                        + "activityRecord=%s", this);
        return false;
    }
    if (onTop) {
        app.addToPendingTop();
    }
    try {
        ProtoLog.v(WM_DEBUG_STATES, "Sending position change to %s, onTop: %b",
                this, onTop);

        mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), token,
                TopResumedActivityChangeItem.obtain(onTop));
    } catch (RemoteException e) {
        // If process died, whatever.
        Slog.w(TAG, "Failed to send top-resumed=" + onTop + " to " + this, e);
        return false;
    }
    return true;
}

system端-传递事务

之后调用到APP端,调用栈如下:

ClientLifecycleManager.scheduleTransaction() ->
ClientLifecycleManager.scheduleTransaction(transaction) ->
ClientTransaction.schedule(){
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }
}

mClient是一个IApplicationThread对象,实际调用到APP端的ApplicationThread.scheduleTransaction()。

APP端-执行事务

(1) 公共过程

​ 每个ClientTransaction对象在system端创建并调度到APP端后,都会执行以下过程。

ApplicationThread.scheduleTransaction() ->
ClientTransactionHandler.scheduleTransaction() ->
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction) ->
ActivityThread.H.handleMessage(Message msg) ->
TransactionExecutor.execute()


(2) 执行Callbacks

​ 如果ClientTransaction对象中的mActivityCallbacks属性不为null,则会执行TransactionExecutor.executeCallbacks()。


(3) 执行LifecycleState

​ 如果ClientTransaction对象中的mLifecycleStateRequest属性不为null,则会执行TransactionExecutor.executeLifecycleState()。


(4) 示例

之后再根据ClientTransaction事务对象执行相关流程,比如onResume()的执行过程如下:

at com.demoapp.activitydemo.MainActivity.onResume(MainActivity.java:136)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1587)
at android.app.Activity.performResume(Activity.java:8699)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5078)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5121)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2425)

TransactionExecutor作为执行ClientTransaction事务的调度类,负责ClientTransaction对象的整个执行过程。