ActivityThead ActivityManagerService 和activity关系概述

Activity 是安卓中最重要的一个元素,安卓如果管理activity? 进程中的主线程如何建立?关于这几个问题我们将简要概述,不会展示太多的代码。

首先来看一下进程的入口函数:ActivityThead,从应用程序的角度,所有的activity 信息都保存在这个类的成员变量中

  1. final HashMap <IBinder,
    ActivityRecord> mActivities = new HashMap <IBinder,
    ActivityRecord> ();

也就是mActivities 记录了所有的activity 实例,这些实例都是这个进程创建的。 Activity Thread
如何创建应用?在这个类的main函数中,它会启动应用和创建消息循环。如下:

  1. /***  . ??*/public static final void main(String[] args) {  SamplingProfilerIntegration.start();  Process.setArgV0("<pre-initialized>");  Looper.prepareMainLooper();  ActivityThread thread = new ActivityThread();  thread.attach(false);  Looper.loop();    if (Process.supportsProcesses()) {     throw new RuntimeException("Main thread loop unexpectedly exited");   }   thread.detach();   String name = (thread.mInitialApplication != null)            ? thread.mInitialApplication.getPackageName()            : "<unknown>";Slog.i(TAG, "Main thread of " + name + " is now exiting");    }

在消息循环创建之前,通过thread.attach (false) 初始化应用的runtime环境,并且通过mAppThread建立ActivityManagerService与应用之间的桥梁,
mAppThread是一个是一个代理,不是一个线程,不要被它的名字迷惑。

  1. android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");            RuntimeInit.setApplicationObject(mAppThread.asBinder());            IActivityManager mgr = ActivityManagerNative.getDefault();            try {                mgr.attachApplication(mAppThread);            } catch (RemoteException ex) {            }

注意:每个APP对应一个 ActivityThread实例,也就是ActivityThread.main,
每个实例也对应一个ApplicationThread对象,它是activityThread和ActivityManagerService的桥梁。Attach函数主要建立了这个桥梁。

ActivityManagerService:

ActivityManagerService 主要实现了对 activity的管理: 历史堆栈里面,最上层是正在运行的Activity.当创建一个新的Acticity的,会创建一个记录r.

  1. HistoryRecord r = new HistoryRecord (this, callerApp,
    callingUid, intent, resolvedType, aInfo, mConfiguration, resultRecord, resultWho, requestCode, componentSpecified);

然后将r保存到堆栈中。

  1. mHistory.add (addPos, r);

但是关于activity 只保存在服务端的mHistory ,客户端没有关注这个activity的记录.我们需要scheduleLaunchActivity方法创建一个新的。

  1. public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,                ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,                List<Intent> pendingNewIntents, boolean notResumed, boolean isForward) {            ActivityRecord r = new ActivityRecord();            r.token = token;            r.ident = ident;            r.intent = intent;            r.activityInfo = info;            r.state = state;            r.pendingResults = pendingResults;            r.pendingIntents = pendingNewIntents;            r.startsNotResumed = notResumed;            r.isForward = isForward;            queueOrSendMessage(H.LAUNCH_ACTIVITY, r);        }
时间: 2024-10-06 17:29:18

ActivityThead ActivityManagerService 和activity关系概述的相关文章

java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述

猛击这里 java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述

【转】Android 之ActivityThead、ActivityManagerService 与activity的管理和创建

在android中,Activity是四大组件中比较重要的一个(当然其他的也比较重要),那么android中是怎样管理这些activity的?应用的进程和主线程是怎么创建的,应用的消息循环又是在什么时候创建的?在这篇文章中将详细介绍: 先来看下涉及到的类,通过以下类图对整体先有个大概的印象: ActivityThread: ActivityThread主要用来启动应用程序的主线程,并且管理在应用端跟用户打交道的activity.在应用端的activity信息全部被存储在ActivityThrea

Android应用程序与SurfaceFlinger服务的关系概述和学习计划 .

转自:http://blog.csdn.net/luoshengyang/article/details/7846923 SurfaceFlinger服务:负责绘制Android应用程序的UI, SurfaceFlinger服务运行在Android系统的System进程中,它负责管理Android系统的帧缓冲区(Frame Buffer).Android系统的帧缓冲区的相关知识, Android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,它们就必须要与SurfaceFlinger服务进行

Android应用程序与SurfaceFlinger服务的关系概述和学习计划【转】

转自 https://blog.csdn.net/luoshengyang/article/details/7846923 SurfaceFlinger服务负责绘制Android应用程序的UI,它的实现相当复杂,要从正面分析它的实现不是一件容易的事.既然不能从正面分析,我们就想办法从侧面分析.说到底,无论SurfaceFlinger服务有多复杂,它都是为Android应用程序服务的,因此,我们就从Android应用程序与SurfaceFlinger服务的关系入手,来概述和制定SurfaceFli

PHP类继承、接口继承关系概述

PHP类继承: PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: 1 class frist{ 2 public function __construct(){ 3 echo "我是第一个类.","<br>"; 4 } 5 public function printer(){ 6 echo "frist","<br>"; 7 } 8 } 9 class seconds ext

Android4.4 framework分析——ActivityManagerService的启动和对Activity的管理

本文主要介绍android4.4中ActivityManagerService的启动和ActivityManagerService对Activity堆栈的管理. 一.ActivityManagerService的启动 ActivityManagerService也是在SystemServer启动的时候创建的, <span style="font-size:18px;">class ServerThread { .......   public void initAndLoo

Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析

在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求WindowManagerService为其增加一个WindowState对象,用来描述它的窗口状态.在本文中,我们就详细分析Activity组件与WindowManagerService的连接过程. 我们从两方面来看Activity组件与WindowManagerService服务之间的连接.一方

简述Activity生命周期

copy from : http://gityuan.com/2016/03/18/start-activity-cycle/ 基于Android 6.0的源码剖析, 分析android Activity启动流程中ActivityManagerService所扮演的角色 一.概述 上一篇文章startActivity启动过程分析,介绍了startActivity是如何一步步创建的,再来看看生命周期的控制.先来一张官方的Activity状态转换图: Activity的生命周期中只有在以下3种状态之

Activity启动(1)----流程

Activity启动过程中做了哪些事情?下面的时序图展示里启动过程中函数的调用过程, 从图中可以知道大概流程. 在介绍细节的时候是从上往下函数调用过程介绍的,如果不知道某个函数是在哪里被谁调用的,可以回过头来看下时序图.下面是对一些细节进行介绍. 1. 在Android中有两种操作会引发Activity的启动,一种用户点击Launcher的应用程序图标时,Launcher会为启动应用程序的主Activity.另外一种是在已经起来的Activity内部通过调用startActvity接口启动新的A