`
fosa0989
  • 浏览: 108623 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity的启动流程【zhuanzai】

阅读更多

Activity启动分为很多种情况,这里说的是打开新的应用程序第一个Activity的流程。

1. AcitivityManager产生新进程,新进程从android.app.ActivityThread.main开始运行。这里就是一般意义上的程序入口点,类似于C的main函数。

ActivityManagerService.java

  private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) {

      // Process里面通知Zygote服务,Zygote真正产生新的进程(准确说是复制一个)

      int pid = Process.start("android.app.ActivityThread",
                    mSimpleProcessManagement ? app.processName : null, uid, uid,

  }

2.ActivityThread的main函数中将Looper准备起来,prepareMainLooper标志着这是应用程序主线程的Looper对象。

ActivityThread.java

  public static final void main(String[] args) {

    Looper.prepareMainLooper();

    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    // 这里闭合消息循环
    Looper.loop();

}

3. 接下来调用attach,参数为false,表明这不是系统进程,是给普通应用程序用使用的进程。

ActivityThread.java

   private final void attach(boolean system) {

            ViewRoot.addFirstDrawHandler(new Runnable() {
                public void run() {
                    ensureJitEnabled();
                }
            });
            RuntimeInit.setApplicationObject(mAppThread.asBinder());
            IActivityManager mgr = ActivityManagerNative.getDefault();
            mgr.attachApplication(mAppThread);

   }

   mAppThread是ApplicationThread对象,是提供给ActivityManagerService控制ActivityThread的回调接口。

private final class ApplicationThread extends ApplicationThreadNative {

  public final void schedulePauseActivity(IBinder token, boolean finished,boolean userLeaving, int  configChanges){

            queueOrSendMessage(finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
                    token, (userLeaving ? 1 : 0),  configChanges);
        }

  public final void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges) {
           queueOrSendMessage(showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,
                token, 0, configChanges);
        }

  .........

}

   ActivityManagerService要Pause当前Activity,就会调用schedulePauseActivity想本地的消息循环 中加入一个H.PAUSE_ACTIVITY的消息,然后立即返回以避免ActivityManagerService的阻塞。

4.现在又回到了ActivityManagerService中

ActivityManagerService.java

    // ActivityManagerService中XXXLocked函数才是真正干活的地方,XXX只是个套

    public final void attachApplication(IApplicationThread thread) {
        int callingPid = Binder.getCallingPid();
        attachApplicationLocked(thread, callingPid);
    }

    private final boolean attachApplicationLocked(IApplicationThread thread, int pid) {

        // 这里取出对应该Pid的ProcessRecord对象,如果取不出来,你就等着out吧

        app = mPidsSelfLocked.get(pid)

        // 为ProcessRecord对象补充信息

        app.thread = thread;
        app.curAdj = app.setAdj = -100;
        app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
        app.setSchedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
        app.forcingToForeground = null;
        app.foregroundServices = false;
        app.debugging = false;
        // 清除timeout监测
        mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);

        // 回调之前的ActivityThread,让它记住自己在ActivityManagerService中的相关信息,传这么大坨东西,真给力

        thread.bindApplication(processName, app.instrumentationInfo != null
                    ? app.instrumentationInfo : app.info, providers,
                    app.instrumentationClass, app.instrumentationProfileFile,
                    app.instrumentationArguments, app.instrumentationWatcher, testMode,
                    isRestrictedBackupMode || !normalMode,
                    mConfiguration, getCommonServicesLocked());

       // topRunningActivityLocked的意思没看太明白

       HistoryRecord hr = topRunningActivityLocked(null);

       // 启动Activity

       realStartActivityLocked(hr, app, true, true);

    }

    private final boolean realStartActivityLocked(HistoryRecord r,
            ProcessRecord app, boolean andResume, boolean checkConfig){

        // 这里又跑到ActivityThread中去了

       app.thread.scheduleLaunchActivity(new Intent(r.intent), r, System.identityHashCode(r),
                    r.info, r.icicle, results, newIntents, !andResume, isNextTransitionForward());

    }

5.ActivityThread开始调度用户的Activity启动了

ActivityThread.java

private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {
       Activity a = performLaunchActivity(r, customIntent);

       ......

}

private final void performLaunchActivity(ActivityRecord r, Intent customIntent) {

       java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
       // 产生Activity
       activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

       // 将新生的Activity与当前应用关联

       activity.attach(appContext, this, getInstrumentation(), r.token,
                       r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstance,
                        r.lastNonConfigurationChildInstances, config);

      .....

}

6.Acivity与当前App关联,直到这里,平时应用所见的Activity才真正被构建

Actiivty.java

final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident,
    Application application, Intent intent, ActivityInfo info,  CharSequence title, Activity parent, String id,
    Object lastNonConfigurationInstance, HashMap<String,Object> lastNonConfigurationChildInstances,
            Configuration config) {

       // 记录传入ContexImpl实例,这就是平时所见的Activity Context
       attachBaseContext(context);
       // 创建与Activity关联的Window,可以简单理解为显示窗口
       mWindow = PolicyManager.makeNewWindow(this);

       mUiThread = Thread.currentThread();

       mMainThread = aThread;
       mInstrumentation = instr;
       mToken = token;
       mIdent = ident;
       mApplication = application;
       mIntent = intent;
       mComponent = intent.getComponent();
       mActivityInfo = info;
       mTitle = title;
       mParent = parent;
       mEmbeddedID = id;
      // 构建WindowManager的代理LocalWindowManager
       mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
       if (mParent != null) {
            // 难道说整个Activity栈中的Activity都有同一个Container
            mWindow.setContainer(mParent.getWindow());
       }
       mWindowManager = mWindow.getWindowManager();

    }

7.ActivityThread

ActivityThread.java

private final void performLaunchActivity(ActivityRecord r, Intent customIntent) {

       ......

       // 回调Activity::onCreate

       mInstrumentation.callActivityOnCreate(activity, r.state);

        // 记录新产生的Activity
       mActivities.put(r.token, r);

}

private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {

       ......

       handleResumeActivity(r.token, false, r.isForward);

}

final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
       ActivityRecord r = performResumeActivity(token, clearHide);

}

public final ActivityRecord performResumeActivity(IBinder token, boolean clearHide) {

        if (r.pendingIntents != null) {
              deliverNewIntents(r, r.pendingIntents);
              r.pendingIntents = null;
       }
       if (r.pendingResults != null) {
              deliverResults(r, r.pendingResults);
              r.pendingResults = null;
       }
       //回调Activity::onResume
       r.activity.performResume();

}

到这里,Activity从产生到初始化的过程就全部结束了。之后就是等待用户界面的消息,根据消息进行相应的处理。整个过程中,在 ActivityManagerServer、ActivityThread的互相协作下构建出Activity,并在相应的时机回调Activity的 相应接口,完成Activity的初始化。

http://blog.csdn.net/dragondog/archive/2011/03/09/6234972.aspx

分享到:
评论

相关推荐

    Hibernate帮助文档.chm--zhuanzai.zip

    Hibernate帮助文档.chm--zhuanzai.zip

    键盘记录器zhuanzai

    1.全能鼠标键盘记录器充分考虑到了用户的操作便利性,工具条及菜单的设计都尽可能的人性化,功能的划分也是清晰明了。初次使用只需要花费极短的时间即可以掌握全能鼠标键盘记录器的全部功能 2.除鼠标键盘等命令外,...

    GAN-Overview-Chinese.pdf

    转载! abstract:前阵子学习GAN的过程中,发现现在的GAN综述大都是Ian Goodfellow或自动化所王飞跃老师的那篇。

    基于深度学习的零样本识别.zip

    基于深度学习的零样本识别.zip

    《大数据原理》LSH算法实现

    用map-reduce的形式实现了LSH算法

    Text-2024-05-09 17-11-33.txt

    Text-2024-05-09 17-11-33.txt

    node-v6.14.4-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于springboot的电影院订票管理系统

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg

    基于深度学习的舌象诊断系统源码+文档说明.zip

    基于深度学习的舌象诊断系统源码+文档说明.zip

    2023-04-06-项目笔记 - 第一百二十八阶段 - 4.4.2.126全局变量的作用域-126 -2024.05.09

    2023-04-06-项目笔记-第一百二十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.126全局变量的作用域_126 - 2024-05-09

    深度学习入门-基于python的理论与实现.zip

    深度学习入门-基于python的理论与实现.zip

    基于python的气象数据处理

    数据处理 |--- 处理气象数据(nc文件) 操作说明: nc 文件命名为:deal_nc.nc,放到data目录下 1、 执行parse_nc.py,解析nc文件,同时在data目录下生成.npy数据文件 2、 执行draw_data.py ,获取.npy数据,并绘制图形

    TPE5608通讯管理机底层

    TPE5608通讯管理机底层

    机器学习,深度学习基础模型实现,基础组件,便于快速复用与集成.zip

    机器学习,深度学习基础模型实现,基础组件,便于快速复用与集成.zip

    node-v6.5.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.0.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    医院机房建设清单明细及报价.xls

    文章摘要 智慧医院智能化系统建设方案旨在通过智能化手段提升医院的安全性、舒适性、便捷性和效率。该方案规划了四大类子系统:平台、应用、节能和安全,以打造一个高效的医疗环境。 信息设施系统:包括综合布线系统、信息网络系统、多媒体会议系统等,旨在为医院提供稳定、高速的网络服务。综合布线系统采用6类非屏蔽铜缆和光纤,支持多种业务信息的传输。信息网络系统采用以太网交换技术和树型网络结构,确保网络的稳定性和安全性。 信息化应用系统:包括信息查询系统、分诊排队叫号系统、ICU探视系统等,通过信息技术提高医疗服务的质量和效率。信息查询系统便于病员及家属查询医院信息,分诊排队叫号系统优化就诊流程,ICU探视系统通过音视频技术实现远程探视和监护。 安全防范系统:针对医患关系敏感、医疗纠纷、医护人身安全等问题,设计了安防音视频监控系统、电子巡更系统、门禁系统等,以提高医院的安全管理水平。安防音视频监控系统在关键区域设置监控摄像机,电子巡更系统确保巡更人员按时按路线完成任务,门禁系统通过权限管理控制人员出入。 机房建设工程:包括机房配电系统、防雷接地系统、消防系统等,确保机房设备的安全稳定运行。机房供配电系统采用普通电源和不间断电源,消防系统采用无管网七氟丙烷气体灭火系统,防雷系统采用三级防雷措施,机房空调系统保持适宜的温度和湿度。 方案特色:紧扣标准、安全简便、统一融合、可视操作、事前预防、智能管控。通过智能化系统的设计和实施,医院能够更有效地进行安全管理,提高医疗服务质量,同时降低维护成本和提升运营效率。

    da_1715269209522..apk

    da_1715269209522..apk

    node-v6.9.5-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    typescript-3.7.6.tgz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics