源码分析Android AMS WMS PMS

今天谈谈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    

你可能感兴趣的:(源码分析Android AMS WMS PMS)