• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 深入理解Activity启动流程

深入理解Activity启动流程

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了activity启动流程,activity 退出 流程,activity流程图,activity流程管理,activity流程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

深入理解Activity启动流程


 

深入理解Activity启动流程(一)–Activity启动相关类的类图

Activity启动时的概要交互流程

用户从Launcher程序点击应用图标可启动应用的入口Activity,Activity启动时需要多个进程之间的交互,Android系统中有一个zygote进程专用于孵化Android框架层和应用层程序的进程。还有一个system_server进程,该进程里运行了很多binder service,例如ActivityManagerService,PackageManagerService,WindowManagerService,这些binder service分别运行在不同的线程中,其中ActivityManagerService负责管理Activity栈,应用进程,task。

Activity启动时的概要交互流程如下图如下所示

activity_start_flow

用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的入口Activity,ActivityManagerService发现这个应用还未启动,则会通知Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法。应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法。

后续博客将介绍Activity的详细启动流程。

 

深入理解Activity启动流程(二)–Activity启动相关类的类图

在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失。

Activity启动时涉及到的类有IActivityManager相关类, IApplicationThread相关类,ActivityManagerService相关类。

IActivityManager相关类

IActivityManager

Activity的管理采用binder机制,管理Activity的接口是IActivityManager. ActivityManagerService实现了Activity管理功能,位于system_server进程,ActivityManagerProxy对象是ActivityManagerService在普通应用进程的一个代理对象,应用进程通过ActivityManagerProxy对象调用ActivityManagerService提供的功能。应用进程并不会直接创建ActivityManagerProxy对象,而是通过调用ActiviyManagerNative类的工具方法getDefault方法得到ActivityManagerProxy对象。所以在应用进程里通常这样启动Activty:

ActivityManagerNative.getDefault().startActivity()

IApplicationThread相关类

IApplicationThread

应用进程需要调用ActivityManagerService提供的功能,而ActivityManagerService也需要主动调用应用进程以控制应用进程并完成指定操作。这样ActivityManagerService也需要应用进程的一个Binder代理对象,而这个代理对象就是ApplicationThreadProxy对象。

ActivityManagerService通过IApplicationThread接口管理应用进程,ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程里。ApplicationThreadProxy对象是ApplicationThread对象在ActivityManagerService线程 (ActivityManagerService线程运行在system_server进程)内的代理对象,ActivityManagerService通过ApplicationThreadProxy对象调用ApplicationThread提供的功能,比如让应用进程启动某个Activity。

ActivityManagerService相关类

ActivityManagerService

ActivityManagerService管理Activity时,主要涉及以下几个类:

  • 1) ActivityManagerService,它是管理activity的入口类,聚合了ProcessRecord对象和ActivityStack对象2) ProcessRecord,表示应用进程记录,每个应用进程都有对应的ProcessRecord对象3) ActivityStack,该类主要管理回退栈4) ActivityRecord,每次启动一个Actvity会有一个对应的ActivityRecord对象,表示Activity的一个记录5) ActivityInfo,Activity的信息,比如启动模式,taskAffinity,flag信息(这些信息在AndroidManifest.xml里声明Activity时填写)6) TaskRecord,Task记录信息,一个Task可能有多个ActivityRecord,但是一个ActivityRecord只能属于一个TaskRecord

    注意:

    ActivityManagerService里只有一个ActivityStack对象,并不会像Android官方文档描述的一样,每个Task都有一个activity stack对象。ActivityStack管理ActivityRecord时,不是下面这样组织ActivityRecord的:

    List taskList; //ActivityStack类
    List recordList;// TaskRecord类

    而是像下面这样组织ActivityRecord:

    ArrayList mHistory = new ArrayList(); //ActivityStack类里
    TaskRecord task; // ActivityRecord类里

    也就是说ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶。

    但是ActivityManagerService调度ActivityRecord时以task为基本单位,每个ActivityRecord对象都属于某个TaskRecord,一个TaskRecord可能有多个ActivityRecord。

    ActivityStack没有TaskRecord列表的入口,只有在ActivityManagerService才有TaskRecord列表的入口:

    final ArrayList mRecentTasks

    ActivityStack管理ActivityRecord时,将属于同一个task的ActivityRecord放在一起,如下所示:

    backstack

    回退栈里可看到两个task,假设上面的task为task1,下面的task为task2,task1包含D,E两个Activity Record,task2包含3个ActivityRecord。task1位于回退栈的栈顶,task2位于task1下面,task1中E位于栈顶,task2中C位于栈顶。需注意两个task的Activity不会混在一起,也就是说task2的B不能放在task1的D和E中间。

    因为回退栈是栈结构,所以此时不断按返回键,显示的Activity的顺序为E–>D–>C–>B–>A。

    下一篇博客为大家讲述Activity的详细启动流程。


    深入理解Activity启动流程(三)–Activity启动的详细流程1

    本篇博客将开始介绍Activity启动的详细流程,由于详细启动流程非常复杂,故此分成两篇来介绍。

    本篇主要介绍前半部分的启动流程:

    • 1. Activity调用ActivityManagerService启动应用2. ActivityManagerService调用Zygote孵化应用进程3. Zygote孵化应用进程

      下篇介绍后半部分的启动流程:

      • 4. 新进程启动ActivityThread5. 应用进程绑定到ActivityManagerService6. ActivityThread的Handler处理启动Activity的消息

        1. Activity调用ActivityManagerService启动应用

        activity_amservice

        在launcher应用程序里启动应用时,点击应用图标后,launcher程序会调用startActivity启动应用,传递的intent参数:

        intent = new Intent(Intent.ACTION_MAIN);
           intent.addCategory(Intent.CATEGORY_LAUNCHER);
           intent.setComponent(className);

        activity最终调用Instrumentation的execStartActivity来启动应用:

        //Activity类
        public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
         if (mParent == null) {
        	Instrumentation.ActivityResult ar =
        	                mInstrumentation.execStartActivity(
        	                    this, mMainThread.getApplicationThread(), mToken, this,
        	                    intent, requestCode, options);
        	   if (ar != null) {
        	                mMainThread.sendActivityResult(
        	                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
        	                    ar.getResultData());
        	   } 
        	//...   
         }else{
          //...
         }

        Instrumentation调用ActivityManagerProxy对象的startActivity方法启动Activity,而ActivityManagerProxy只是ActivityManagerService对象在应用进程的一个代理对象,ActivityManagerProxy最终调用ActivityManagerService的startActvity方法启动Activity。

        //Instrumentatio
        
        
        
         
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 《转》深入理解Activity启动流程(一)–Activity启动的概要流程,《转》activity
  • 深入理解Activity启动流程
  • 第二个activity,启动第二个activity

相关文章

  • 2017-05-26Glide,glideandroid
  • 2017-05-26Android事件分发机制浅谈(一),android浅谈
  • 2017-05-26【开源】二维码签到手机andriod版下载!,开源签到andriod
  • 2017-05-26首页3--界面上拉下拉的回弹效果,3--拉下
  • 2017-05-26android注册页面,android页面
  • 2017-05-26android Notification介绍,androidnotification
  • 2017-05-26Android studio 百度地图开发(1)配置工程、显示地图
  • 2017-05-26Android 7.0(牛轧糖)新特性,android牛轧糖
  • 2017-05-26和我一起看API(一)你所不知道的LinearLayout补充,apilinearlayout
  • 2017-05-26ubuntu下ssh的应用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 硅谷商城5--购物车商品选中和商品总价计算,5--购物车
    • AndroidStudio项目打包成jar,androidstudiojar
    • 产品原型图设计,产品原型图
    • PostgreSQL空值null参与运算的处理方法
    • 自定义控件详解(二):Path类 相关用法,详解path
    • 分析google的multidex库,googlemultidex库
    • android handler传递消息机制,androidhandler
    • XListView,xlistview用法
    • Android实现一个自定义相机的界面
    • 仿有道词典应用项目源码,有道词典项目源码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有