`
liuguofeng
  • 浏览: 456105 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 
阅读更多

[置顶]Android 之ActivityThead、ActivityManagerService 与activity的管理和创建

分类: Android 4707人阅读 评论(17) 收藏 举报

 

android中,Activity是四大组件中比较重要的一个(当然其他的也比较重要),那么android中是怎样管理这些activity的?应用的进程和主线程是怎么创建的,应用的消息循环又是在什么时候创建的?在这篇文章中将详细介绍:

 

先来看下涉及到的类,通过以下类图对整体先有个大概的印象:

 

 

ActivityThread:

ActivityThread主要用来启动应用程序的主线程,并且管理在应用端跟用户打交道的activity。在应用端的activity信息全部被存储在ActivityThread的成员变量mActivities中。

 

[java] view plaincopy
  1. final HashMap<IBinder, ActivityRecord> mActivities= new  HashMap<IBinder, ActivityRecord>();   

 

也就是说,在mActivities中,记录了应用程序创建的所有activity实例记录,对应的是ActivityRecord

ActivityThread是怎么启动应用程序的呢?ActivityThread中有一个main函数,在这个里面,将启动应用程序并建立消息循环。在之前也介绍过,系统会为主线程自动创建消息循环。

  

[java] view plaincopy
  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)来初始化应用程序的运行环境,并建立activityThreadActivityManagerService之间的桥mAppThread, mAppThreadIApplicationThread的一个实例。

 

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

 

注意:每个应用程序对应着一个ActivityThread实例,应用程序由ActivityThread.main打开消息循环。每个应用程序同时也对应着一个ApplicationThread对象。该对象是activityThreadActivityManagerService之间的桥梁。

attach中还做了一件事情,就是通过代理调用attachApplication,并利用bindertransact机制,在ActivityManagerService中建立了ProcessRecord信息。

之后通过该ProcessRecord就可以获得该ActivityThread中的所有ActivityRecord记录。下面会介绍。

 

ActivityManagerService:

ActivityManagerService中,也有一个用来管理activity的地方:mHistory栈,这个mHistory栈里存放的是服务端的activity记录HistoryActivity(class HistoryRecord extendsIApplicationToken.Stub)。处于栈顶的就是当前running状态的activity

我们来看一下ActivitystartActivity方法的请求过程:

从该时序图中可以看出,Activity.startActivity()方法最终是通过代理类和Binder机制,在ActivityManagerService.startActivity方法中执行的。

那么在ActivityManagerServicestartActivity中,主要做了那些事情?我们来看下里面比较重要的代码段:

  • 根据activityProcessRecord等信息创建HistoryRecord实例r
    [c-sharp] view plaincopy
    1. HistoryRecord r = new HistoryRecord(this, callerApp, callingUid,intent, resolvedType, aInfo, mConfiguration,resultRecord, resultWho, requestCode, componentSpecified);  

  • r加入到mHistory中。
    [c-sharp] view plaincopy
    1. mHistory.add(addPos, r);   
  • activity被加入到mHistory之后,只是说明在服务端可以找到该activity记录了,但是在客户端目前还没有该activity记录。还需要通过ProcessRecord中的threadIApplication)变量,调用它的scheduleLaunchActivity方法在ActivityThread中创建新的ActivityRecord记录(之前我们说过,客户端的activity是用ActivityRecord记录的,并放在mActivities中)。
  • [c-sharp] view plaincopy
    1. app.thread.scheduleLaunchActivity(new Intent(r.intent), r,System.identityHashCode(r),                    r.info, r.icicle, results, newIntents, !andResume,                    isNextTransitionForward());  

涉及的主要类图:

再来看下ApplicationThread中的scheduleLaunchActivity方法:

 

[c-sharp] view plaincopy
  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);        }  

 

在这个里面主要是根据服务端返回回来的信息创建客户端activity记录ActivityRecord. 并通过Handler发送消息到消息队列,进入消息循环。在ActivityThread.handleMessage()中处理消息。最终在handleLaunchActivity方法中把ActivityRecord记录加入到mActivities(mActivities.put(r.token,r))中,并启动activity(涉及到windowviewwindowManager,详情请看handleResumeActivity()方法和上一篇关于windowWindowManager的介绍)

 

总结:

  1. 在客户端和服务端分别有一个管理activity的地方,服务端是在mHistory中,处于mHistory栈顶的就是当前处于running状态的activity,客户端是在mActivities中。
  2. startActivity时,首先会在ActivityManagerService中建立HistoryRecord,并加入到mHistory中,然后通过scheduleLaunchActivity在客户端创建ActivityRecord记录并加入到mActivities中。最终在ActivityThread发起请求,进入消息循环,完成activity的启动和窗口的管理等

分享到:
评论

相关推荐

    android ActivityManagerService 源码分析----Activity管理

    Android ActivityManagerService 是 Android 系统中负责管理 Activity 生命周期的核心组件之一。它提供了一个 ArrayList mHistory 来管理所有的 Activity,Activity 在 AMS 中的形式是 ActivityRecord,Task 在 AMS ...

    Android2.3 ActivityManagerService流程分析

    Android2.3 ActivityManagerService流程分析

    ActivityManagerService相关流程分析

    标题“ActivityManagerService相关流程分析”指明了本文档探讨的重点是Android系统中用于管理Activity生命周期、任务栈(TaskStack)和进程管理的关键组件ActivityManagerService(AMS)。AMS是Android系统中一个...

    AMS注释源码(ActivityManagerService)

    ams注释源码,startActivity相关逻辑已添加注释!快速帮助你理解AMS的处理逻辑,该资源配合我的博客Android进阶 — ActivityManagerService模块分析(https://blog.csdn.net/jackzhouyu/article/details/109021412)

    android多个activity和一个service通信

    首先,我们来看如何创建和启动一个Service。Service的声明通常在AndroidManifest.xml文件中完成,然后在需要启动Service的地方调用Context.startService()或Context.bindService()方法。startService()用于一次性...

    Android-Service与Activity传值

    在Android应用开发中,`Service`和`Activity`是两个重要的组件。`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如...

    android Service 与Activity绑定

    通过理解和掌握Service与Activity的绑定机制,开发者可以更高效地利用Service来实现后台任务,提高应用的用户体验和稳定性。同时,源码阅读和工具使用能帮助开发者更好地诊断和优化Service的使用。

    Android Service与Activity交互

    本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...

    分析Android Activity的启动过程

    然后PackageManagerService去查询所有action为“android.intent.action.MAIN”并且category为“android.intent.category.LAUNCHER”的Activity,然后为每个应用程序创建一个快捷方式图标,并把程序信息与之关联。...

    android中activity和service的交互

    在Android应用开发中,Activity和Service是两个非常重要的组件,它们各自承担着不同的职责。Activity作为用户界面的主要载体,负责与用户进行交互;而Service则是在后台运行,不与用户界面直接互动,常用于执行长...

    Android开发-Activity与Service使用Messenger通信代码

    在Android应用开发中,Activity和Service是两个非常重要的组件。Activity负责用户界面的展示,而Service则用于在后台执行长时间运行的任务,不依赖用户界面。然而,在某些情况下,Activity需要与Service进行通信,...

    android_的Activity和Service之间的通信

    android_的Activity和Service之间的通信

    android系统从systemserver开始的launcher启动详细流程.doc

    1. 创建 ActivityManagerService 实例:ActivityManagerService 是 Android 系统中最重要的系统服务之一,负责管理活动、服务和广播等。ActivityManagerService 的实例化是 SystemServer 的主要工作之一。 2. 创建 ...

    Activity绑定Service(Kotlin)

    在Android应用开发中,Service是用于执行长时间运行操作的一个组件,而Activity是用户与应用交互的界面。将Activity与Service绑定是一种常见的通信方式,尤其在需要在后台运行任务且需要与用户界面保持交互时。本...

    浅谈android性能优化之启动过程(冷启动和热启动)

    3. 在 Android 应用程序框架层中,ActivityManagerService 是一个非常重要的接口,它不但负责启动 Activity 和 Service,还负责管理 Activity 和 Service。 Step 1. 无论是通过 Launcher 来启动 Activity,还是通过...

    android service 通过broadcast通知activity

    在Android应用开发中,Service是实现后台运行任务的关键组件,它可以独立于用户界面持续执行操作。...记得在应用的生命周期管理中正确处理Service和BroadcastReceiver的启动与停止,以避免资源浪费和内存泄漏。

    Activity和Service生命周期及使用AIDL通信实例备份

    在Android应用开发中,Activity和Service是两个至关重要的组件,它们各自承载着不同的功能和应用场景。本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行...

    android开机启动Activity/Service/App的三合一demo

    android开机启动Activity/Service/App的三合一demo,本人写了一个小小demo,把如果开机自启动Activity、Service、APP写了下,欢迎下载。

    Activity_boot_process_analysis

    - ApplicationThreadNative和ActivityStackSupervisor:负责应用程序进程与ActivityManagerService之间的通信。 - ActivityStack:管理Activity的启动栈和任务栈。 在Activity启动过程中,系统可能还会调用以下方法...

    Android学习之Activity弹窗

    通过查看Android源码,我们可以了解到它们是如何创建和管理视图、如何响应触摸事件、如何与Activity协同工作等细节。这有助于我们编写更高效、更符合Android设计原则的代码。 在实际项目中,工具类往往扮演着重要...

Global site tag (gtag.js) - Google Analytics