今天谈谈Android三大系统服务,AMS WMS PMS。
1、首先从他们的产生开始说起。
Android手机一开机的流程,开机启动,在Java层入口是SystemServer,代码如下
android.os.Process.setThreadPriority();
Looper.prepareMainLooper();
// 创建systemserver上进程的ActivityThread和SystemContext
createSystemContext();
// 增加SystemServiceManager:统一管理system services的创建,启动和生命周期,多用户切换
mSystemServiceManager = new SystemServiceManager(mSystemContext);
// Start services
// 1.创建AMS
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
// Start the Power Manager service
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
// Start the package manager service
mPackageManagerService = PackageManagerService.main();
// 2.将SystemServer进程可加到AMS中调度管理
mActivityManagerService.setSystemProcess();
// 3.将相关provider运行在systemserver进程中:SettingsProvider
mActivityManagerService.installSystemProviders();
final Watchdog watchdog = Watchdog.getInstance();
watchdog.init(context, mActivityManagerService);
// Start Window Manager
wm = WindowManagerService.main()
// 4.直接保存wms对象,与WMS交互
mActivityManagerService.setWindowManager(wm);
// 5.通过WMS 弹出“正在启动应用”框
ActivityManagerNative.getDefault().showBootMessage();
// 6. AMS作为Framework核心,做好准备就绪后就开始启动应用层,和对AMS有依赖的服务
mActivityManagerService.systemReady(new Runnable(){
//启动SystemUI
startSystemUi(context);
//启动WatchDog监控核心服务状态
Watchdog.getInstance().start();
mmsServiceF.systemRunning();
});
// Loop forever.
Looper.loop();
先要声明的是,Android的context,context可以被称之为Android的运行环境,其中提供了很多Android运行所需数据(如启动服务广播,activity,得到res,得到page信息),Application、Activity、service都是他的子类,在这里SystemServer 首先创建Context。还要提及的是loop,Android中很多地方用到handerThread,他跟loop的配合使用实现了异步任务请求。
然后启动AMS,WMS,PMS三个系统服务,然后发送广播:开机广播、升级广播等等,再启动launcher,launcher是什么,
launcher就是一个acitivity,LaucherActivity里面设置了点击事件,点击一个app就进入。
2、再看看,点击一个app图标之后发生了什么?
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = intentForPosition(position);
startActivity(intent);
}
执行的是context. startActivity,context里面调用的是ActivityManager的startActivity方法,看看里面做了什么
public void startActivity(Context context, Intent intent, Bundle options) {
ActivityThread thread = ActivityThread.currentActivityThread();
thread.getInstrumentation().execStartActivityFromAppTask(context,
thread.getApplicationThread(), mAppTaskImpl, intent, options);
}
这里看到了ActivityThread类, ActivityThread在main方法里有两个要注意的操作
1、Application app = r.packageInfo.makeApplication(false, mInstrumentation);
用pagemanager得到Application
2、activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
nstrumentation new一个Activity,mInstrumentation.callActivityOnCreate,创建一个activity
这里需要解释两个点Instrumentation和AppTask
Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
AppTask:activity任务管理方法,每个Activity的信息类就是RunningTaskInfo,通过以下方法,添加flags去实现activity的启动
public void moveTaskToFront(int taskId, @MoveTaskFlags int flags) {
moveTaskToFront(taskId, flags, null);
}
@RequiresPermission(android.Manifest.permission.REORDER_TASKS)
public void moveTaskToFront(int taskId, @MoveTaskFlags int flags, Bundle options) {
try {
getService().moveTaskToFront(taskId, flags, options);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
3、然后启动一个Activity之后,会怎样呢?
每个Activity里面有一个Window对象,好了,三个管理类都出现了,Window是一个接口,PhoneWindow是实现类,他有三个方法:
public abstract void setContentView(View view, ViewGroup.LayoutParams params);
public abstract void addContentView(View view, ViewGroup.LayoutParams params);
public abstract void clearContentView();
通过这几个方法在dectorView上面设置view