美文网首页
Android系统组件之AWS工作原理

Android系统组件之AWS工作原理

作者: 蜗牛是不是牛 | 来源:发表于2022-10-24 22:46 被阅读0次

    AWS工作原理

    ActivityManager

    ActivityManager是提供给客户端调用的接口,日常开发中我们可以利用ActivityManager来获取系统中正在运行的
    组件(Activity、Service)、进程(Process)、任务(Task)等信息,ActivityManager定义了相应的方法来获取
    和操作这些信息。
    ActivityManager定义了很多静态内部类来描述这些信息,具体说来:
    ·ActivityManager.Stackld:描述组件栈D信息
    ·ActivityManager.StackInfo:描述组件栈信息,可以利用Stacklnfo去系统中检索某个栈。
    ·ActivityManager..MemoryInfo:系统可用内存信息
    ·ActivityManager..RecentTasklnfo:最近的任务信息
    ·ActivityManager.RunningAppProcesslnfo:正在运行的进程信息
    ·ActivityManager.RunningServicelnfo:正在运行的服务信息
    ·ActivityManager..RunningTaskInfo:正在运行的任务信息
    ·ActivityManager..AppTask:描述应用任务信息
    说道这里,我们有必要区分一些概念,以免以后混淆。
    ·进程(Process):Android系统进行资源调度和分配的基本单位,需要注意的是同一个栈的Activity可以运行在
    不同的进程里。
    ·任务(Task):Task是一组以栈的形式聚集在一起的Activity的集合,这个任务栈就是一个Task。
    在日常开发中,我们一般是不需要直接操作ActivityManageri这个类,只有在一些特殊的开发场景才用的到。
    ·isLowRamDevice0:判断应用是否运行在一个低内存的Android设备上。
    ·clearApplicationUserData():重置app里的用户数据。
    ·ActivityManager..AppTask/ActivityManager.RecentTaskInfo:我们如何需要操作Activity的栈信息也可以通过
    ActivityManager来做。
    ActivityStack

    ActivityStack内部定义了一个枚举类来描述Activity的状态。

    enum Activitystate
    INITIALIZING,//正在初始化
    RESUMED,//恢复
    PAUSING,//正在暂停
    PAUSED,//暂停
    STOPPING,//正在停止
    STOPPED,//停止
    FINISHING,//正在结束
    DESTROYING,//正在销毁
    DESTROYED//销毁
    }
    

    主要角色有:
    ·ActivityRecord:描述栈里的Activity相关信息,对应着一个用户界面,是Activity管理的最小单位。
    ·TaskRecord:是一个栈式管理结构,每个TaskRecord可能包含一个或多个ActivityRecord,栈顶的
    ActivityRecord表示当前用户可见的页面。
    ·ActivityStack:是一个栈式管理结构,每个ActivityStack可能包含一个或多个TaskRecord,栈顶的TaskRecord表示当前用户可见的任务。
    ·ActivityStackSupervisior:管理者多个ActivityStack,当前只会有一个获取焦点(focused)的ActivityStack。
    ·ProcessReocord:保存着属于用一个进程的所有ActivityRecord,我们知道同一个应用的Activity可以运行在不同的进程里,同一个TaskRecord里的ActivityRecord可能属于不同ProcessRecord,反之,运行在不同TaskRecord的ActivityRecord可能属于同一个ProcessRecord。

    ActivityRecord

    ActivityRecord基本上是一个纯数据类,里面包含了Activity的各种信息。
    ·Activitylnfo从标签中解析出来的信息,包含launchMode,permission,taskAffinity等
    mActivityType
    Activity的类型有三种:APPLICATION_ACTIVITY_TVPE(应用)HOME_ACTIVITY_TYPE(桌面)、RECENTS_ACTIVITY_TYPE(最近使用)
    ·apploken
    当前ActivityRecord的标识
    ·packageName
    当前所属的包名,这是由静态定义的
    ·processName
    当前所属的进程名,大部分情况都是由静态定义的,但也有例外
    ·taskAffinity相同taskAffinity的Activity会被分配到同一个任务栈中
    ·intent启动当前Activity的Intent
    ·launchedFromUid启动当前Activity的U川D,即发起者的UID
    launchedFromPackage
    启动当前Activity的包名,即发起者的包名
    ·resultTo在当前ActivityRecord看来,resultTo表示上一个启动它的ActivityRecord,当需要启动另一个ActivityRecord,会把自己作为resultTo,传递给下一个ActivityRecord
    ·state
    ActivityRecord所处的状态,初始值是ActivityState.INITIALIZING
    ·app ActivityRecord的宿主进程
    ·task ActivityRecord的宿主任务
    inHistory
    标识当前的ActivityRecord是否已经置入任务栈中
    ·frontOfTask标识当前的ActivityRecord.是否处于任务栈的根部,即是否为进入任务栈的第一个ActivityRecord
    ·newlntents Intent数组,用于暂存还没有调度到应用进程Activity的Intent
    除了ActivityRecord以外,还有其他几种Record,用来记录其他组件的信息.
    ·ActivityRecord:描述Activity组件信息。
    ·ProcessRecord:描述进程信息。
    ·ServiceRecord:描述Service组件信息。
    ·BroadcastRecord:描述Broadcasts组件信息。
    ·ReceiverRecord:描述Broadcast Receiver信息。
    ·ContentProviderRecord:描述ContentProvider?组件信息。
    ·ContentProviderConnection:描述ContentProviderConnection信息,
    那么这些组件的信息都存储在哪里呢?
    ·Activity的信息记录在ActivityStack、ActivityStackSupervisor和AM中。
    ·Service的信息记录在BroadcastQueue和AMS中。
    ·Broadcast的信息记录在ActiveServices和AMS中。
    ·Provider的信息记录在ProviderMap和AMS中.

    TaskRecord

    TaskRecord的职责就是管理ActivityRecord,事实上,我们平时说的任务栈指的就是TaskRecord,所有ActivityRecord都必须要有宿主任务,如果不存在则新建一个。
    ·taskid
    TaskRecord的唯一标识
    ·taskType任务栈的类型,等同于ActivityRecord的类型,是由任务栈的第一个ActivityRecord决定的
    在当前任务栈中启动的第一个Activity的Intent将会被记录下来,后续如果有相同的Intent时,会与已有任务栈的Intenti进行匹配,如果匹配上了,就不需要再新建一个TaskRecord了
    ·realActivity,origActivity启动任务栈的Activity,这两个属性是用包名(CompentName)表示的,real和orig是为了区分Activity有无别名(alias)的情况,如果AndroidManifest.xml中定义的Activity是一个alias,则此处real
    表示Activity的别名,orig表示真实的Activity
    ·affinity TaskRecord把Activity的affinity记录下来,后续启动Activity时,会从已有的任务栈中匹配affinity,如果匹配上了,则不需要新建TaskRecord
    ·rootAffinity记录任务栈中最底部Activity的affinity,一经设定后就不再改变
    ·Activities这是TaskRecord:最重要的一个属性,TaskRecord是一个栈结构,栈的元素是ActivityRecord,其内部实现是一个数组mActivities
    当前TaskRecord所在的ActivityStack
    我们前面说过TaskRecord是一个栈结构,它里面的函数当然也侧重栈的管理:增删改查。事实上,在内部TaskRecord,是用ArrayList来实现的栈的操作。
    ·getRootActivity()/getTopActivity):任务栈有根部和顶部,可以通过这两个函数分别获取到根部和顶部的ActivityRecord。获取的过程就是对TaskRecord.mActivitiesi进行遍历,如果ActivityRecord的状态不是finishing,就认为是有效的ActivityRecord。
    ·topRunningActivityLocked(O:虽然也是从顶至底对任务栈进行遍历获取顶部的ActivityRecord,但这个函数同getTopActivity()有区别:输入参数notTop,表示在遍历的过程中需要排除notTop这个ActivityRecord;
    addActivityToTop()/addActivityAtBottom)(:将ActivityRecord添加到任务栈的顶部或底部。
    ·moveActivityToFrontLocked():该函数将一个ActivityRecord移至TaskRecord的顶部,实现方法就是先删除已有的,再在栈顶添加一个新的,这个和ntent.FLAG_ACTIVITY_REORDER_TO_FRONT相对应。
    ·setFrontOfTask():ActivityRecord有一个属性是frontOfTask,表示ActivityRecord是否为TaskRecord的根Activity。该函数设置TaskRecord中所有ActivityRecord的frontOfTask属性,从栈底往上开始遍历,第一个不处于finishing状态的ActivityRecord的frontOfTask.属性置成true,其他都为false。
    ·performClearTaskLocked0:清除TaskRecord中的ActivityRecord。这个和Intent..FLAG_ACTIVITY_CLEAR_TOP相对应,当启动Activity时,设置了Intent.FLAG_ACTIVITY_CLEAR_TOP参数,那么在宿主
    TaskRecord中,待启动ActivityRecord之上的其他ActivityRecord都会被清除。

    ActivityStack

    ActivityStack的职责是管理多个任务栈TaskRecord。
    我们都知道Activity有着很多生命周期状态,这些状态就是由ActivityStack来推动完成的,在ActivityStack.里,
    Activity有九种状态:
    。INITIALIZING:初始化
    ·RESUMED:己显示
    ·PAUSING:暂停中
    ·PAUSED:已暂停
    ·STOPPING:停止中
    ·STOPPED:己停止
    ·FINISHING:结束中
    ·DESTROYING:销毁中
    ·DESTROYE:己销毁
    这些状态的变化示意了Activity生命周期的走向。
    我们也来简单看一下ActivityStack里的一些字段的含义:
    ·stackld每一个ActivityStack都有一个编号,从0开始递增。编号为0,表示桌面(Launcher)所在的ActivityStack,叫做Home Stack
    ·mTaskHistory TaskRecord数组,ActivityStack栈就是通过这个数组实现的
    ·mPausingActivity在发生Activity切换时,正处于Pausing状态的Activity
    ·mResumedActivity当前处于Resumed状态的ActivityRecord
    ·mStacks ActivityStack:会绑定到一个显示设备上,譬如手机屏幕、投影仪等,在AMS中,通过ActivityDisplay这个类来抽象表示一个显示设备,ActivityDisplay.mStacks表示当前已经绑定到显示设备的所有ActivityStack。.当护执行一次绑定操作时,就会将ActivityStack.mStacks:这个属性赋值成
    ActivityDisplay.mStacks,否则,ActivityStack.mStacks就为null。简而言之,当mStacks.不为null时,表示当前ActivityStack已经绑定到了一个显示设备。
    Activity状态发生变化时,出来要调整ActivityRecord.statel的状态,还要调整ActivityRecord在栈里的位置,事实上,ActivityStack也是一个栈式的结构,只不过它管理的是TaskRecord,和ActivityRecord
    相关的操作也是先找到对应的TaskRecord,再由TaskRecord去完成具体的操作。

    ActivityStackSupervisior

    ActivityStackSupervisior用来管理ActivityStack。
    ActivityStackSupervisiorl的一些常见属性如下所示:
    ·mHomeStack主屏(桌面)所在ActivityStack
    ·mFocusedStack表示焦点ActivityStack,它能够获取用户输入
    ·mLastFocusedStack上-个焦点ActivityStack
    ·mActivityDisplays表示当前的显示设备,ActivityDisplay中绑定了若干ActivityStack。通过该属性就能间接获取
    所有ActivityStack的信息
    ActivityStackSupervisior!里有很多方法与ActivityStack里的方法类似,但是ActivityStackSupervisior是针对多个
    ActivityStacki进行操作。例如:findTaskLocked(),findActivityLocked(),topRunningActivityLocked(O,
    ensureActivitiesVisibleLocked().

    来自:https://www.yuque.com/beesx/beesandroid/pi7qpx

    相关文章

      网友评论

          本文标题:Android系统组件之AWS工作原理

          本文链接:https://www.haomeiwen.com/subject/vhnozrtx.html