android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制

android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制
一、ActivityManagerService提供的主要功能:
       (1)统一调度各应用程序的Activity
       (2)内存管理

       (3)进程管理

      二、启动一个Activity的方式有以下几种:
   (1)在应用程序中调用startActivity启动指定的Activity
   (2)在Home程序中单击一个应用图标,启动新的Activity
   (3)按“Back”键,结束当前Activity,返回到上一个Activity
   (4)长按“Home”键,显示出当前正在运行的程序列表,从中选择一个启动
     这四种启动方式的主体处理流程都会按照第一种启动方式运行,后面三种方式只是在前端消息处理上各有不同。

      三、进程数据类ProcessRecord

      该类的源代码在~frameworksbaseservicesjavacomandroidserveram路径下。

      一般情况下,一个APK文件运行时会对应一个进程,ProcessRecord用来记录一个进程中的相关信息,主要包含的变量有:
      (1)进程文件信息:与该进程对应的APK文件的内部信息,如

        final ApplicationInfo info; // all about the first app in the process
        final String processName;   // name of the process

        final ArrayMap<String, ProcessStats.ProcessState> pkgList 
            = new ArrayMap<String, ProcessStats.ProcessState>();   //保存进程中所有APK文件包名

      (2)进程的内存状态信息:用于Linux系统的out of memory(OOM)情况的处理,当发生内存紧张时,Linux系统会根据进程的内存状态信息杀掉低优先级的进程,包括的变量有

        int maxAdj;                 // Maximum OOM adjustment for this process
        int curRawAdj;              // Current OOM unlimited adjustment for this process
        int setRawAdj;              // Last set OOM unlimited adjustment for this process
        int curAdj;                 // Current OOM adjustment for this process
        int setAdj;                 // Last set OOM adjustment for this process
       变量中Adj的含义是调整值(adjustment)

     (3)进程中包含的Activity、Provider、Service等,如下

       final ArrayList<ActivityRecord> activities = new ArrayList<ActivityRecord>();
       final ArraySet<ServiceRecord> services = new ArraySet<ServiceRecord>();
       final ArraySet<ServiceRecord> executingServices = new ArraySet<ServiceRecord>();
       final ArraySet<ConnectionRecord> connections = new ArraySet<ConnectionRecord>();
       final ArraySet<ReceiverList> receivers = new ArraySet<ReceiverList>();
       final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<String,             ContentProviderRecord>();
    final ArrayList<ContentProviderConnection> conProviders = new ArrayList<ContentProviderConnection>();

     四、ActivityRecord数据类(Android 2.3以前版本叫HistoryRecord类)

     ActivityManagerService使用ActivityRecord数据类来保存每个Activity的信息,ActivityRecord类基于IApplicationToken.Stub类,也是一个Binder,所以可以被IPC调用。

     主要包含的变量有:

   (1)环境信息:Activity的工作环境,比如进程名称、文件路径、数据路径、图标、主题等,这些信息一般是固定的,比如以下变量

    final String packageName; // the package implementing intent's component
    final String processName; // process where this component wants to run
    final String baseDir;   // where activity source (resources etc) located
    final String resDir;   // where public activity source (public resources etc) located
    final String dataDir;   // where activity data should go
    int theme;              // resource identifier of activity's theme.
    int realTheme;          // actual theme resource we will use, never 0.

   (2)运行状态数据信息:如idle、stop、finishing等,一般为boolean类型,如下

    boolean haveState;      // have we gotten the last activity state?
    boolean stopped;        // is activity pause finished?
    boolean delayedResume;  // not yet resumed because of stopped app switches?
    boolean finishing;      // activity in pending finish list?
    boolean configDestroy;  // need to destroy due to config change?

   五、TaskRecord类

    ActivityManagerService中使用任务的概念来确保Activity启动和退出的顺序。
    TaskRecord中的几个重要变量如下:
    final int taskId;       // 每个任务的标识.
    Intent intent;          // 创建该任务时对应的intent
    int numActivities;   //该任务中的Activity数目
    final ArrayList<ActivityRecord> mActivities = new ArrayList<ActivityRecord>();  //按照出现的先后顺序列出该任务中的所有Activity

     六、ActivityManagerService中一些重要的与调度相关的变量

    (1)记录最近启动的Activity,如果RAM容量较小,则记录的最大值为10个,否则为20个,超过该值后,Ams会舍弃最早记录的Activity
      static final int MAX_RECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20;
    (2)当Ams通知应用程序启动(Launch)某个Activity时,如果超过10s,Ams就会放弃
    static final int PROC_START_TIMEOUT = 10*1000;
    (3)当Ams启动某个客户进程后,客户进程必须在10s之内报告Ams自己已经启动,否则Ams会认为指定的客户进程不存在
    static final int PROC_START_TIMEOUT = 10*1000;
    (4)等待序列:
    当Ams内部还没有准备好时,如果客户进程请求启动某个Activity,那么会被暂时保存到该变量中,
      final ArrayList<PendingActivityLaunch> mPendingActivityLaunches
            = new ArrayList<PendingActivityLaunch>();
    (5)优先启动,其次再停止。进程A1包含两个Activity,启动顺序为A1->A2,当用户请求启动A2时,如果A1正在运行,Ams会先暂停A1,然后启动A2,当A2启动后再停止A1。
       private final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();

     七、startActivity()的流程
       当用户单击某个应用图标后,执行程序会在该图标的onClick()事件中调用startActivity()方法,该方法会调用startActivityForResult(),在这个方法内部会调用Instrumentation对象的executeStartActivity()方法,每个Activity内部都有一个Instrumentation对象的引用,它就是一个管家,ActivityThread要创建或者暂停某个Activity都是通过它实现的。

      流程图如下所示:



     下面附上ActivityManagerService的完整源代码,有兴趣的童鞋可以深入研究。

  

爱华网本文地址 » http://www.aihuau.com/a/418451/178603332752.html

更多阅读

中小学教师职业道德规范学习笔记

中小学教师职业道德规范学习笔记一、依法执教。学习和宣传马列主义、毛泽东思想和邓--同志建设有中国特色社会主义理论,拥护党的基本路线,全面贯彻国家教育方针,自觉遵守《教师法》等法律法规,在教育教学中同党和国家的方针政策保持一

伤寒学习笔记(下

伤寒学习笔记---14,桂枝用量问题?学习仲景药法,涉及用量问题。深入考证,固然不必,简单了解,实属必要。仅以桂枝为例,整理如下:基本资料:《现代中医药应用与研究大系》1985年版,简称《大系》。药法:凡例里说:“将其折合今之用量---,并结合笔者临床

关于闪光灯TTL的学习笔记

关于闪光灯TTL的学习笔记(转)俺注:一直对加闪光灯的拍摄比较疑惑,要知道并不是加开个闪光就一了百了的。特别是现在的专业闪灯,有好几种模式,都需要配合相机的测光使用。今天无意之间看到一篇解疑的文章,赶紧收集下来仔细学习。想学习下闪

IE内核浏览器开发笔记 360浏览器是ie内核吗

IE内核浏览器开发笔记 2010-03-29 10:56 1001人阅读 评论(3) 收藏 举报开发一个浏览器,或者浏览器插件,或者浏览器上的工具条,并不是很难的事情,因为微软已经考虑到了这一些需求,因此给我们提供了一些接口和方法来实现这些想法,只是这些接

声明:《android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制》为网友逝然陌分享!如侵犯到您的合法权益请联系我们删除