Android中ActivityManagerService与应用程序(客户端)通信模型分析

本文深入解析Android 2.2版本中ActivityManagerService(AMS)如何与应用程序通信,探讨核心功能、关键类和数据结构,如ActivityThread、Instrumentation、ActivityRecord等。AMS作为系统服务管理所有Activity,通过Binder机制与客户端交互,处理启动、停止Activity等操作。理解通信模型有助于掌握Android应用的运行机制。
摘要由CSDN通过智能技术生成
今天主要分析下ActivityManagerService(服务端) 与应用程序(客户端)之间的通信模型,在介绍这个通信模型的基础上,再

   简单介绍实现这个模型所需要数据类型。

 

        本文所介绍内容基于android2.2版本。由于android版本的不同,本文所包含的一些类可能在命名等细节上做了一些更改,但

   万变不离其宗,整个核心思想和通信流程依旧如下。

            例如,①、在android2.3上就将android2.2中ActivityManagerService的很处理逻辑提炼出来,形成了一个单独的

        ActivityStack类,因而显得更“高级”;

                     ②、将后文讲解到的HistoryRecord.java直接重名名ActivityRecord.java等。

 

             很多不同点我也就不在细说了。大家在研究源码的过程里,注意差异就成。

 

 

       Android的三大核心功能有如下三个:

           1、View.java    关于View工作原理,《Android中View绘制流程以及invalidate()等相关方法分析》分析过。

                   功能有: 绘制图形、处理触摸、按键事件等;

           2、ActivityManagerService.java  简称为 AMS

                   功能有:管理所有应用程序的Activity 、内存管理等 。

           3、WindowManagerService.java 简称为WMS

                   功能有:为所有应用程序分配窗口,并管理这些窗口。

 

 

        从上可知,AMS作为一种系统级服务管理所有Activity,当操作某个Activity时,例如: 启动一个新的Activity、停止当前

    Activity,必须报告给AMS,而不能“擅自处理”。当AMS接受到具体通知时,会根据该通知的类型,首先会更新内部记录,

    然后在通知相应客户进程去运行一个新的Activity或者停止指定的Activity。另外,由于AMS记录了所有Activity的信息,当然

    能够主动的调度这些Activity,甚至在内存不足时,主动杀死后台的Activity。

 

    首先对模型中可能运到的类做一个介绍:

     ActivityThread.java    路径位于:\frameworks\base\core\java\android\app\ActivityThread.java

         说明: 该类为应用程序(即APK包)所对应进程(一个进程里可能有多个应用程序)的主线程类,即我们通常所说的UI线程。

           一个ActivityThread类对应于一个进程。最重要的是,每个应用程序的入口是该类中的static main()函数 。

   

      Activity.java               路径位于:\frameworks\base\core\java\android\app\Activity.java

        说明:该类是与用户交互的对象,同时也是APK应用程序运行的最小单元。ActivityThread类会根据用户的操作选择运行

          哪个Activity。当前运行的Activity是出于resume状态(有且仅有一个),其他Activity出于pause或stop状态。

 

      Instrumentation.java  路径位于 :\frameworks\base\core\java\android\app\ActivityThread.java

         说明: 该类用于具体操作某个Activity的功能----单向(oneway)调用AMS以及统计、测量该应用程序的所有开销。

            一个Instrumentation类对应于一个进程。每个Activity内部都有一个该Instrumentation对象的引用。

 

      举个例子吧。

           我们将我们应用程序比作一个四合院,那么Activity对应于四合院的人,ActivithThread对应于院子的主人----管理所有人,

    Instrumentation对应于管家------受气的命,接受来自人(Activity/ActivithThread)的命令 ,去单向(oneway)调用AMS 。

 

  ApplicationThread类是ActivityThread的内部类:

       说明:该类是一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的消息,继而做相应处理。

 

   ActivityManagerService.java 路径位于:        

                                       \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

       说明:该类是一个Binder类,即可实现跨进程通信。因此可以接受从客户端,例如Instrumentation、Context等调用过来的

           信息。ActivityManagerService提供了全局的代理对象,供IPC调用。

 

 

  AMS与ActivityThread的通信模型图如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值