3 Activity设计框架

3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的Activity。应用程序员在建立Android应用时,构建Activity的子类就是Andoid外特性空间展现的接口。我们可以从下面的简单的例子描述看看Activity,到底如何建立的。
  DemoActivity extend Activitya
  {
  onCreate
  onResume
  onPause
  onStop
  }
  在Android的外特性空间(SDK)中,Android应用程序员根本不知道进程是什么时候起来的,系统消息是如何传递过来的。这个DemoActivity是如何实例化的呢?并且该Activity是托管在哪个进程的呢?本节的分析将给出答案。
  我们从ActivityThread中可以看到在应用进程中的Activity都被放置在mActivities中。
                        

11.jpg (20.14 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:47 上传

 

  这些ActivityRecord记录了应用进程中,程序员建立的Activity子类的实例,我们称之为外特性空间的Activity。这些Activity类实例是放在应用程序端进行实际交互的Activity,而为了管理这些Activity,AMS内核中还有一个影子Activity,被称为HistoryRecord。
  3.2 Activity与HistoryRecord的关系
  在整个系统中,Activity实际上有两个实体。一个在应用进程中跟应用程序员打交道的Activity,一个是在AMS的中具有管理功能的History Record。应用进程中的Activity都登记ActivityThread实例中的mActivity数组中,而在AM端,HistroytRecord实例放置在mHistroy栈中。mHistory栈是Android管理Activity的场所,放置在栈顶的就是User看到的处于活动状态的Activity。
  Activity与HistrotyRecord的关系图可以表示如下:
                        

22.jpg (44.38 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:48 上传

 

  Activity的内核实体是依靠在ProcessRecord的成员变量中,通过ProcessRecord我们可以访问到所有的属于该Process的Activity。而在ProcessRecord记录了与应用进程之间的联系:IActivtityThread接口。通过该接口,可以访问到所对应的Activity的方法。在Launch Activity时,AMS将对应的HistoryRecord作为token传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。
  3.3 Actvity的Launch过程
  1)发起请求startActivity(intent)
  2)Activity Service Manager接收到请求执行StartActivity函数。
  建立:HistoryRecord实例r。
  将r 加入到mHistory顶。
  (3)通过app.thread。scheduleLaunchActvity(app,r)@ActivityThread.java
  (4)在App应用中建立新的ActivityRecord。
  (5)建立新的Activity对象并放入到ActivityRecord中。
  (6)将ActivityRecord加入到mActivites@ActivityThread
  (7)发起Activity.onCreate(),,该onCreate就是在你的应用程序XXXActivity中的onCreate。
                     

33.jpg (43.78 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:49 上传

 

  3.4 Activity的Resume(1)Activity什么时候被Resume
                     

44.jpg (18.06 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:49 上传

 

  (2)Rusume的过程
  通过该过程的研究我们会进一步的了解到AMS与应用进程的交互过程。
  在AMS端,满足resume条件都会调用:Resume的核心函数:resumeTopActivityLocked@ActivityManagerService
  XXX当前栈顶的HistroyRecord
  1)窗口切换:隐藏前一个Activity的窗口,
  2)更新LRUList,(LRUList是淘汰应用程序的依据之一)
  3) XXX.app.thread.scheduleResumeActivity(XXX,
  isNextTransitionForward());
  4)completeResumeLocked
  setFocusedActivityLocked
  mFocusActivity=xxx  //此时焦点Actvitiy切换了。
  WM.setFocusedApp(xxx,
  mWindowManager.executeAppTransition();
  mNoAnimActivities.clear();
  在应用程序端:
  (5)scheduleResumeActivity
  handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
  ActivityRecord r = performResumeActivity(token, clearHide);
  ActivityRecord r = mActivities.get(token);
  r.activity.performResume()
  performResume
  整个Resume的过程如下:
                     

55.jpg (44.24 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 11:51 上传

 

最新文章

  1. selenium 打开浏览器
  2. SqlServer windowss身份登陆和sa身份登陆
  3. JavaScript Timer实现动画效果
  4. C#模拟Http与Https请求框架实例
  5. Message Queue vs. Web Services?
  6. JDK中的并发bug?
  7. metasploit-post模块信息
  8. golang操作文件的四种方法
  9. 数据库范式(1NF 2NF 3NF BCNF)
  10. 自定义弧形的 tabBar
  11. 实用Python 语句集(入门者入)
  12. PHP静态化之真静态化
  13. Linux--正则表达式--详解
  14. EntityFramework、Dapper vs 草根框架性能
  15. ASA IPSEC VPN配置
  16. css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
  17. C++ 空间配置器(allocator)
  18. win10 下安装mysql服务器社区版本mysql-5.7.22-winx64
  19. elasticsearch kabana中创建索引
  20. Ex 5_32 一台服务器当前有n个等待服务的顾客...第八次作业

热门文章

  1. 6 让我们的C#程序开始做点数学运算
  2. [原创]flexslider 中文文档 使用教程 参数手册
  3. 关于1>LINK : fatal error LNK1168: 无法打开 ....exe或者....dll进行写入的问题
  4. Protocol-SPI协议
  5. TF-IDF与余弦相似性的应用(三):自动摘要
  6. 【BZOJ】【1005】【HNOI2008】明明的烦恼
  7. smaa github iryoku
  8. Sencha Touch xtype对应的class
  9. 《暗黑世界GM管理后台系统》部署+功能说明文档
  10. Http Url Get请求方式需要对中文参数进行编码