android_Ams简介

  Android中,manager的含义是经纪人,所管理的对象是服务本身,因为每个具体的服务都会提供多个API接口。
  Android中,设备商要扩充framework:增加一些额外的类文件,这些类文件一般以独立的jar包存在;修改已有文件,可以使用import,但为了保持和原生Framework的兼容性/对原生framework最少化修改,可以使用类装载器动态装载自定义jar包。
  从WmS看,一个窗口不是Window类,而是View类。View类本身不能直接接收WmS消息,真正接收用户消息的必须是IWindow类,ViewRoot.W类实现了IWindow类。WmS不介意窗口View属于哪个应用程序,WmS会按照一定的规则判断哪个窗口处于活动状态,然后把消息给W类,W类在把用户消息传递给内部的View变量,消息处理由View对象完成。
  窗口类型:应用窗口(对应Activity);子窗口(有父窗口);系统窗口。窗口对应的层Layer,对应z-order,值越大,层的位置越靠上面。
  有些窗口只能出现一个,不能添加多个(输入法窗口/系统状态条窗口),因此,WmS在接收到创建窗口的消息时,会进行一定的检查,确保该窗口只能被创建一次。
  token变量(一般是一个IBinder对象,为了进行IPC)。与创建窗口相关的IPC对象有两个:指向某个W类token;指向ActivityRecord的token(AmS内部为运行的每一个Activity创建的一个Binder对象)。
  Activity中的mToken;Window中的mToken;WindowManager.LayoutParams中的mToken。
  Android内核三大核心:ActivityManagerService.java;WindowManagerService.java;View.java;
  AmS主要功能:统一调度各应用程序的Activity;内存管理(关闭而不退出;内存紧张时,退出优先级低的进程);进程管理;
  Activity调度机制:启动或停止,首先报告给AmS,不能擅自处理。AmS更新内部记录,再通知客户进程运行或停止。
  启动一个Activity方式:应用程序中调用startActivity方法;Home中点击应用程序图标;按back,结束当前,启动上一个;长按Home,显示任务列表,选择一个启动;
  AmS中几个重要数据类型:ProcessRecord(进程);ActivityRecord(活动);TaskRecord(任务);
  应用程序设计时,不能在onPause中做过多的事情。
  Android是多进程(多个应用程序存在),WmS的设计特点,非前台应用程序没有机会获得消息,从而没有机会占用CPU。Android底层未采用磁盘虚拟内存机制,物理内存作为最大内存。
  Windows系统是完整的多进程/多窗口操作系统,Ipad/Android只能算多进程/单窗口系统。
  单窗口与多窗口系统设计区别:系统必须为每一个应用程序分配窗口,并且常驻;按键消息同时发送到所有的应用程序;窗口系统能够处理多个窗口的层叠/位移等变化;窗口系统要将多个窗口绘制到屏幕上(Android中SurfaceFlinger模块)。
  ActivityGroup类,内部成员变量LocalActivityManager,它可以访问应用进程的主类(ActivityThread类)。ActivityThread是被隐藏的,客户端主类变量访问权限为包内访问。LocalActivityManager是和ActivityThread在同一个包内。
  LocalActivityManager内部机制核心:它使用了主线程对象mActivityThread来装载指定的Activity(装载,不是启动)。LocalActivityManager的startActivity就是利用主线程mActivityThread去装载指定Activity。

  启动activity调用startActivityForResult(Intent, int);
 public void startActivityForResult(Intent intent, int requestCode) {
    if (mParent == null) {//Activity启动执行交由Instrumentation对象去处理
          Instrumentation.ActivityResult ar =
              mInstrumentation.execStartActivity(
                  this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode);

      //mMainThread 在 attach 方法中被设置,当 ActivityThread PerformLauchActivity ,调用 attach 把 ActivityThread.this 传送过来
      //mMainThread.getApplicationThread() 它是一个进程通信服务端存根对象,提供了很多操作 ActivityThread 的方法,它继承了 ApplicationThreadNative           

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