源码分析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    

    原文作者:Z东方
    原文地址: https://blog.csdn.net/zdf091119/article/details/79593404
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞