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().
网友评论