ActivityManager是一个和AMS相关联的类,它主要对运行中的Activity进行管理,这些管理工作并不是由ActivityManager来处理的,而是交由AMS来处理的。ActivityManager中的方法会通过ActivityManagerNative(AMN)的getDefault方法来得到ActivityManagerProxy(AMP),通过AMP就可以和AMN进行通信,而AMN是一个抽象类,它将功能交由它的子类AMS来处理,因此AMP就是AMS的代理类,AMS作为系统服务,很多API是不会暴露给ActivityManager的。
在Activity的启动过程中,会调用Instrumentation的execStartActivity放,此方法中会调用AMN的getDefault来获取AMS的代理类AMP,接着调用AMP的startActivity方法。在getDefault方法中调用了gDefault的get方法,gDefault是一个Singleton类,先获取名为“activity”的Service引用,也就是IBinder类型的AMS的引用,接着将它封装成AMP类型对象,并将它保存到gDefault中,此后调用AMN的getDefault方法就会直接返回AMS的代理对象AMP。
在asInterface方法中,descriptor值为android.app.IActivityManager类型,queryLocalInterface主要用来查询本地进程是否又IActivityManager接口的实现,有则返回,没有就将IBinder类型的AMS引用封装成AMP。在AMP的构造方法中将AMS的引用赋值给变量mRemote,这样在AMP中就可以使用AMS了。
其中IActivityManager是一个接口,AMN和AMP都实现了这个接口,用于实现代理模式和Binder通信。AMP是AMN的内部类,在AMP的startActivity方法中,首先将传入的参数写入到Parcel类型的data中,通过IBinder类型对象mRemote(AMS的引用)向服务端的AMS发送了一个START_ACTIVITY_TRANSACTION类型的进程间通信请求,服务端的AMS就会从Binder线程池中读取客户端发来的数据,最终会调用AMN的onTransact方法,此方法会调用AMS的startActivity方法,最终调用startActivityAsUser,返回ActivityStarter的startActivityMayWait方法。
AMP是AMN的内部类,它们都实现了IActivityManager接口,这样它们就可以实现代理模式,具体来讲是远程代理:AMP和AMN是运行在两个进程中的,AMP是client端,AMN是Server端,而Server端中具体的功能是由AMN的子类AMS来实现的,因此AMP就是AMS在client端的代理类。AMN又实现了Binder类,这样AMP和AMS就可以通过Binder来进行进程间通信。ActivityManager通过AMN的getDefault方法得到AMP,通过AMP就可以和AMS进行通信。
Android8.0的AMS相关类与Android7.0的有一些差别,在Activity的启动过程中,会调用Instrumentation的execStartActivity方法,接着调用Service方法,getService方法调用了IActivityManagerSingleton的get方法,IActivityManagerSingleton是一个Singleton类。先得到名为“activity”的Service引用,也就是IBinder类型的AMS应用,接着将它转换为IActivityManager类型的对象,采用的是AIDL,IActivityManager类是由AIDL工具在编译时自动生成的,IActivityManager.aidl的文件路径为frameworks/base/core/java/android/app/IActivityManager.aidl。要实现进程间通信,服务端也就是AMS只需要继承IActivityManager.Stub类并实现相应的方法就可以。采用AIDL后就不需要使用AMS的代理类AMP了。因此Android8.0去掉了AMP,代替它的是IActivityManager,它是AMS的本地代理。
Android8.0的AMS相关类要简单的多,ActivityManager的getService方法会得到IActivityManager,AMS只需要继承IActivityManager.Stub类,就可以和ActivityManager实现进程间通信了。
AMS的启动是在SystemServer进程中启动的,从SystemServer的main方法开始,main方法只调用了SystemServer的run方法,先创建消息Looper,然后加载动态库libandroid_server.so。创建系统的Context,创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理,接着调用startBootstrapServices方法,用SystemServiceManager启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务,然后调用startCoreServices方法启动了DropBoxManagerService、BatteryService、UsageStatsService和WebViewUpdateService。调用startOtherServices方法启动了CameraService、AlarmManagerService、VrManagerService等服务,这些服务的父类均为SystemService。官方把系统服务分为了三种类型,分别是引导服务、核心服务、其他服务。
在startBootstrapServices方法中,调用了SystemServiceManager的startService方法,该方法参数为ActivityManagerService.Lifecycle.class。在startService中将service对象添加到ArrayList类型的mServices中来完成注册。然后调用service的onStart方法来启动Service对象。Lifecycle是AMS的内部类,在Lifecycle的构造方法中,创建了AMS实例,当调用了SystemService类型的service的onStart方法时,实际上是调用了AMS的start方法,Lifecycle的getService方法返回了AMS实例。这样在SystemServer的startBootstrapServices方法中mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService实际得到的就是AMS实例。
Zygote的Java框架层中,会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。要启动一个应用程序,首先要保证这个应用程序所需要的进程已经存在。在启动应用程序时AMS会检查这个应用程序需要的进程是否存在,不存在就会请求Zygote进程创建需要的应用程序进程。已Service为例,Service在启动过程中会调用ActivityServices的bringUpServiceLocked方法,先得到ServiceRecord的processName的值并赋值给procName,其中processName用来描述Service想要在哪个进程运行,默认是当前进程,也可以在AndroidManifest文件中设置android:process属性来新开启一个进程运行Service。将procName和Service的uid传入到AMS的getProcessRecordLocked方法中,来查询是否存在一个与Service对应的ProcessRecord类型的对象app,ProcessRecord主要用来描述运行的应用程序进程的信息。如果Service对应的app为null则说明用来运行Service的应用程序进程不存在,则调用AMS的startProcessLocked方法来创建对应的应用程序进程;如果用来运行Service的应用程序进程存在,则调用realStartServiceLocked方法来启动Service。
AMS与应用程序进程的关系主要有以下两点:
内部记录了Activity的所有信息,用来描述了一个Activity,在启动Activity时被创建的,具体时在ActivityStarter的startActivity方法中被创建的。
ActivityRecord的重要成员变量:
名称 | 类型 | 说明 |
---|---|---|
service | ActivityManagerService | AMS的引用 |
info | ActivityInfo | Activity中代码和AndroidManifest设置的节点信息,比如launchMode |
launchedFromPackage | String | 启动Activity的包名 |
taskAffinity | String | Activity希望归属的栈 |
task | TaskRecord | ActivityRecord所在的TaskRecord |
app | ProcessRecord | ActivityRecord所在的应用程序进程 |
state | ActivityState | 当前Activity的状态 |
icon | int | Activity的图标资源标识符 |
theme | int | Activity的主题资源标识符 |
ActivityRecord的作用,其内部存储了Activity的所有信息,包括AMS的引用,AndroidManifest节点信息,Activity状态,Activity资源信息和Activity进程相关信息。
TaskRecord用来描述一个Activity任务栈
名称 | 类型 | 说明 |
---|---|---|
taskId | int | 任务栈的唯一标识符 |
affinity | String | 任务栈的倾向性 |
intent | Intent | 启动这个任务栈的Intent |
mActivities | ArrayList< ActivityRecord> | 按照历史顺序排列的Activity记录 |
mStack | ActivityStack | 当前归属的ActivityStack |
mService | ActivityManagerService | AMS的引用 |
TaskRecord的作用,其内部存储了任务栈的所有信息,包括任务栈的唯一标识符、任务栈的倾向性、任务栈中的Activity记录和AMS的引用等。
ActivityStack是一个管理类,用来管理系统所有Activity,其内部维护了Activity的所有状态、特殊状态的Activity以及和Activity相关的列表数据。ActivityStack是由ActivityStackSupervisor来进行管理的,而ActivityStackSupervisor在AMS的构造方法中被创建,在createStackSupervisor方法中创建了ActivityStackSupervisor。
在ActivityStackSupervisor中由多种ActivityStack,mHomeStack用来存储Launcher App的所有Activity,mFocusedStack表示当前正在接收输入或启动下一个Activity的所有Activity,mLastFocusedStack表示此前接收输入的所有Activity。通过ActivityStackSupervisor提供了获取上述ActivityStack的方法,比如要获取mFocusedStack,只需要调用ActivityStackSupervisor的getFocusedStack方法就可以了。
再ActivityStack中通过枚举存储了Activity的所有状态。
enum ActivityState {INITIALIZING,RESUMED,PAUSING,PAUSED,STOPPING,STOPPED,FINISHING,DESTROYING,DESTROYED
}
overridePendingTransition方法用于设置Activity的切换动画,可以看到只有ActivityState为RESUMED状态或者PAUSING状态时才会调用WMS类型的mWindowManager对象的overridePendingAppTransition方法来切换动画。
mPausingActivity: 正在暂停的Activity
mLastPausedActivity:上一个已暂停的Activity
mLastNoHistoryActivity:最近一次没有历史记录的Activity
mResumedActivity:已经resume的Activity
mLastStartedActivity:最近一次启动的Activity
mTranslucentActivityWaiting:传递给convertToTranslucent方法最上层的Activity
在ActivityState中维护了很多ArrayList
ArrayList | 元素类型 | 说明 |
---|---|---|
mTaskHistory | TaskRecord | 所有没有被销毁的Activity任务栈 |
mLRUActivities | ActivityRecord | 正在运行的Activity,列表中第一个条目时最近最少使用的Activity |
mNoAnimActivities | ActivityRecord | 不考虑转换动画的Activity |
mValidateAppTokens | TaskGroup | 用于与窗口管理器验证应用令牌 |
ActivityRecord用来记录一个Activity的所有信息,TaskRecord中包含了一个或多个ActivityRecord,TaskRecord用来表示Activity的任务栈,用来管理栈中的ActivityRecord,ActivityStack又包含了一个或多个TaskRecord,它是TaskRecord的管理者。Activity栈管理就是建立在Activity任务栈模型上的,有了栈管理,可以对应用程序进行操作,应用可以服用自身应用中以及其他应用的Activity,节省了资源。
在Intent中定义了很多FLAG,其中几个FLAG也可以设定Activity的启动方式。
可以在l中设置android:taskAffinity,用来指定Activity希望归属的栈,在默认情况下,同一个应用程序的所有的Activity都有着相同的taskAffinity。
本文发布于:2024-01-30 15:16:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659900520925.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |