3Activity 设计框架
3.1 外特性空间的Activity
对于AMS来讲,这个Activity就是客服端的Activity。
DemoActivity extend Activity
{
onCreate
onResume
onPause
onStop
}
在Android 的外特性空间(SDK)中,程序员根本不知道进程是什么时候起来的,系统消息是如何传递过来的。这个DemoActivity 是如何实例化的呢?并且该Activity是托管在哪个进程的呢?

我们从ActivityThread中可以看到Activity都被放置在mActivities中。


这些ActivityRecord记录了程序员建立的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的关系图可以表示如下:


Activity 的内核实体依靠在ProcessRecord的成员变量中,通过ProcessRecord我们可以访问到所有的属于该Process的Activity。而在ProcessRecord记录了与应用进程之间的联系:IActivtityThread接口。通过该接口,可以访问到所对应的Activity的方法。在LaunchActivity时,AMS将对应的HistoryRecord 作为token传递到客户端和客户端的Activity 建立联系。在AMS 中Activity 状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递。
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。


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


(2)Rusume的过程
在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 的过程如下:


更多相关文章

  1. [Android(安卓)Pro] Android中全局Application的onCreate多次调
  2. android中的service
  3. Android(安卓)四大组件 - bindService 的通信过程
  4. Android(安卓)关闭整个应用程序
  5. android kill process 杀死进程的方法
  6. AIDL进程间通信
  7. Android中获取应用程序(包)的信息----PackageManager
  8. android学习----通过android帮助,学习TextView属性。
  9. Android面试宝典

随机推荐

  1. 【Mysql】实现中位数计算
  2. 约束数据库表,以便只有一行可以在列中具有
  3. sqlite developer过期解决办法
  4. python pandas库的应用(类比mysql语言)
  5. SQL Server 高可用性(一)AlwaysOn 技术
  6. 为什么我使用此Linq to Sql方法获得Inval
  7. PB中动态SQL处理BLOB的方式
  8. mysql-5.7.21-winx64.zip 下载安装(Win10)
  9. 网站速度慢及其解决方法
  10. 在Delete From语句中带有别名的表变量。