精华内容
下载资源
问答
  • Activity启动过程

    2017-06-20 23:42:42
    Activity启动过程
  • Activity启动流程

    2018-03-01 10:09:54
    Activity启动流程参考Activity启动流程 Android应用启动流程分析Launcher启动App时序图该时序图来自:Android应用启动流程分析点击查看大图简化流程Created with Raphaël 2.1.0Launcher进程Launcher进程Activity...

    Activity启动流程

    参考

    Activity启动流程
    Android应用启动流程分析

    Launcher启动App时序图

    该时序图来自:Android应用启动流程分析

    enter image description here

    点击查看大图

    简化流程

    Created with Raphaël 2.1.0Launcher进程Launcher进程ActivityManagerService进程ActivityManagerService进程Zygote进程Zygote进程要启动的APP进程要启动的APP进程startActivityschedulePauseActivityActivityThread中Instrumentation调用onPause通知AMS Launcher onPaused创建新进程zygote fork创建新进程ActivityThread执行main方法绑定ApplicationscheduleLaunchActivityInstrumentation调用onCreate onResumeActivityResumedscheduleStopActivityonStop
    展开全文
  • activity启动流程

    2020-03-25 16:21:06
    今天要分析下fwk中activity的启动流程,之前看别人画的流程图,总是很快就忘记了,而且总是摸不着重点,遇到具体问题时...学习activity启动流程时,请带着这样几个问题去阅读源码: 新的activity是何时被创建的?...

    今天要分析下fwk中activity的启动流程,之前看别人画的流程图,总是很快就忘记了,而且总是摸不着重点,遇到具体问题时还是不知道从何入手,又得从头看起。后来我想通了一件事,我们在分析这种源码时不应该过渡纠结于流程图与某个具体函数,而应该从宏观角度想想:要实现这个功能,他应该要包含哪些步骤?

    学习activity启动流程时,请带着这样几个问题去阅读源码:

    1. 新的activity是何时被创建的?进程内启动activity与启动一个新进程过程有什么区别?
    2. 启动activity时,当前的activity应该是要进到后台的,那这个时间顺序是怎样的?这几个activity的顺序由谁来管理?
    3. 启动过程中的切换动画是什么时候调用的?activity启动后activity、window、application是什么时候绑定在一起的?

    这几个问题的答案见我下面的标红部分,希望能有助于大家在遇到实际问题时,能直接定位到相关节点去分析,节省时间。

     

    目录

    具体流程

    相关类简介


     

    具体流程

    整个流程可以分为两大步骤:启动前准备与真正启动。

    1. 启动前准备:在ActivityStarter和ActivityStackSupervisor 类中完成当前activity的暂停,并通知新的Activity的启动;(涉及Intent解析,activity在栈中的进出。旧Activity.onPause--新Activity.onCreate-onStart-Resume--旧Activity.onStop。)
    2. 在ActivityThread中完成activity、application的创建和绑定,并调用界面显示等;

    具体流程如下:

    1. Activity的startActivity
    2. Instrumentation#execStartActivity
      1. ActivityManagerNative.getDefault().startActivity;(getDefault()返回的是ActivityManagerService的远程接口ActivityManagerProxy,通过binder通信调用ActivityManagerService.startActivity。AMS通知ActivityThread是通过ApplicationThread(在frameworks/base/core/java/android/app/ActivityThread.java中)和ApplicationThreadProxy。)
      2. ActivityStarter.startActivityMayWait 中调用startActivityLocked;
        1. 解析Intent得到更多信息
        2. 调用startActivityLocked;
        3. startActivity方法;
        4. startActivityUnchecked;
      3. ActivityStarter.startActivityUnchecked(实质会根据信息中launchMode,flag等来计算调度ActivityStack中的task,ActivityRecord等,);
        1. ActivityStack.startActivityLocked(源码为mTargetStack.startActivityLocked。将activity添加到栈顶,初始化WindowManager,回到StackSupervisor,调用StackSupervisor.resumeTopActivitiesLocked,再调回ActivityStack.resumeTopActivityInnerLocked);
          1. WindowManagerService.prepareAppTransition 去准备activity跳转动画
          2. next.setVisibility 去使得动画可见
        2. 调用ActivityStack.startPausingLocked暂停交互当前Activity,里面通过prev.app.thread.schedulePauseActivity调用ActivityThread.handlePauseActivity,接着调用performPauseActivityIfNeeded,然后是Instrumentation 的callActivityOnPause,调用activity.performPause();然后的onPause,然后调用ActivityManagerNative.getDefault()(获取代理对象ActivityManagerProxy).activityPaused告诉ActivityManagerService 旧的Activity已经onPause,可以启动新的Activity了。
      4. ActivityStackSupervisor.startSpecificActivityLocked:(如果是新进程就调用startProcessLocked;如果不是就调用realStartActivityLocked)
        1. 在新进程中启动时会执行到startProcessLocked(最终调用ActivityManagerService.startProcessLocked去创建新进程,主要是调用Process.start接口来创建一个新的进程,新的进程会导入android.app.ActivityThread类,并且执行它的main函数)
        2. ActivityThread.main调用attach方法,最终调到ActivityManagerService.attachApplicationLocked里面,此时Process(并不是application)已经创建,就调用ActivityStackSupervisor.realStartActivityLocked(里面也有更新Configuration去真正启动activity,最终调用到ActivityThread.handleLaunchActivity:
    3. ActivityThread.handleLaunchActivity;
      1. handleLaunchActivity:
        1. 解析前面传过来的ActivityClientRecord,来收集activity的相关信息(是前面生成的);
        2. performLaunchActivity去实例化activity对象和application对象;
          1. 用mInstrumentation.newActivity去实例activity
          2. 调用LoadedApk.makeApplication:去创建application对象(若使用了多进程,application对象会存在多个。);
          3. 创建Configuration;
          4. 调用activity.attach把activity、application和window关联起来(需要用到Configuration)
          5. 设置应用theme主题;
          6. 通过调用mInstrumentation.callActivityOnCreate去调用Activity.performCreate,里面可以调用onCreate;
          7. 调用mInstrumentation.callActivityOnRestoreInstanceState
        3. handleResumeActivity:
          1. performResumeActivity;
            1. Activity.performResume:
              1. performRestart:
              2. onResume:
          2. decor.setVisibility(View.INVISIBLE);此时视图才可见。

     

    切换Activity窗口时Window变化的过程可参考:

    https://blog.csdn.net/luoshengyang/article/details/8596449

     


     

    相关类简介

    (参考:https://blog.csdn.net/ambitionsd/article/details/83342279):

    ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期

    ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作

    ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。

    ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。

    Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。

    ActivityStack:这个并不是我们平时所说的任务栈,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。ActivityStack管理了一系列的TaskRecord,通过mStackId来唯一标识,持有ActivityStackSupervisor的引用。

    ActivityStackSupervisor,这是高版本才有的类,它用来管理多个ActivityStack,早期的版本只有一个ActivityStack对应着手机屏幕,后来高版本支持多屏以后,就
    有了多个ActivityStack,于是就引入了ActivityStackSupervisor用来管理多个ActivityStack。

    ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。

    TaskRecord:这个才是我们平时所说的任务栈,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。

    ActivityStarter:启动activity相关逻辑;

    App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。

     

    另外强烈推荐看下:https://www.jianshu.com/p/94816e52cd77

    这篇文章详细介绍了ActivityRecord、 TaskRecord,ActivityStack。

     

     

     

    展开全文
  • Activity 启动过程

    2017-07-03 16:45:06
    Activity 启动过程启动应用进程启动,调用 ContextImpl 的 startActivity(); 最终调用的 startActivityForResult(); 方法startActivityForResult 中调用 Instrumentation 的 execStartActivity();execStartActivity ...

    Activity 启动过程

    启动

    应用进程

    启动,调用 ContextImpl 的 startActivity(); 最终调用的 startActivityForResult(); 方法

    startActivityForResult 中调用 Instrumentation 的 execStartActivity();

    execStartActivity 中调用 ActivityManagerNative.getDefault().startActivity();ActivityManagerNative.getDefault();方法得到的是 IActivityManager ,该类继承了 IInterface 接口,ActivityManagerNative 继承了 Binder 并实现了 IActivityManager 接口,ActivityManagerService 继承了 ActivityManagerNative,也是一个 Binder,是IActivityManager 的具体实现类。ActivityManagerNative.getDefault 方法中通过 Binder 机制得到 ActivityManagerNative 实现类 ActivityManagerService 对象的代理类 ActivityManagerProxy 的对象,在 ActivityManagerNative 中以单例的形式提供,ActivityManagerNative.getDefault() 得到的是 ActivityManagerProxy 对象,通过该对象的 startActivity 方法会远程调用系统进程 ActivityManagerService 对象的 startActivity 方法。Instrumentation 的 execStartActivity 方法中接着调用 checkStartActivityResult() 由 AMS.startActivity 方法的返回值判断 Activity 是否注册,未注册抛出异常。

    IActivityManager --> ActivityManagerNative --> ActivityManagerService(实现类) (ActivityManagerProxy 客户端中的代理类)
    

    系统进程

    ActivityManagerService 的 startActivity(); 方法中调用 ActivityStackSupervisor.java 和 ActivityStack.java 两个类中的方法,最终在 ActivityStackSupervisor 类的 realStartActivityLocked 方法中调用 app.thread.scheduleLaunchActivity(); 方法。 app.thread 类型为 IApplicationThread,是一个接口,继承了 IInterface 接口,其中定义了大量启动、停止Activity 和 服务接口,即 IApplicationThread 的实现类对象完成了启动及停止 Activity 和 Service 的功能。

    IApplicationThreadNative 是抽象类, 继承了Binder 并实现了 IApplicationThread 接口,即为一个 Binder,ApplicationThread 为 其具体实现类,也为一个 Binder, ApplicationThread 是 ActivityThread 中的内部类。在启动 Activity 时从客户端通过进程间通信将 ActivityThread 的代理类 ActivityThreadProxy 对象传递到了系统进程,系统进程中的 app.thread 为 ActivityThreadProxy 类的对象,通过调用 ActivityThreadProxy 对象的方法会经过进程间通信调用 ActivityThreadNative 实现类对象中的方法,也就是调用其实现类 ApplicationThread 对象中的方法,所以系统进程中调用 app.thread 的 startActivity 方法时会在应用进程中调用 ApplicationThread 类对象的 startActivity 方法。

    应用进程

    通过 ApplicationThead 的 scheduleLaunchActivity(); 该方法中通过ActivityThread 中的 Handler 发送 Message ,将执行线程从 Binder 线程切换到主线程, Handler 中调用 ActivityThread 的 handleLaunchActivity() 方法并从中调用 performLaunchActivity() 完成Activity对象的创建及启动,handleLaunchActivity 中再调用 handleResumeActivity 方法调用被启动Activity 的 onResume() 方法

    应用进程中 Activity 的创建与启动

    performLaunchActivity() 方法中,
    - 第一步,从 ActivityClientRecord 中获取待启动的 Activity 的组件信息 ActivityInfo

    • 第二步,通过 Instrumentation 的 newActivity() 方法使用类加载器创建 Activity 对象
      Classloader.loadClass(String className).newInstance();

    • 第三步,通过 LoadeApk 类的 makeApplication 方法中 通过 Instrumentation 的 newApplication 方法创建 Application 对象,同样使用类加载器创建类对象,在创建 ContextImpl 对象,再将该 ContextImpl 对象与 Application 对象绑定并调用其 onCreate 方法。如果 Application 已经创建过则不会再次创建,一个应用只能有一个 Application 对象。

      • 通过 ContextImpl 的 createAppContext() 方法,创建 Application 的 ContextImpl 对象 appContext
      • ContextImpl创建之后,调用 appContext.setOuterContext(app) 方法将 ContextImpl 与 Application 绑定并完成数据初始化
      • 接着通过 Instrumentation 的 callApplicationOnCreate 方法调用 Application 的 onCreate 方法完成 Application 的启动。
    • 第四步,通过 ContextImpl 的 createActivityContext 创建 Activity 的 ContextImpl 对象,并通过 Activity 的 attach 方法与 ContextImpl 绑定并完成一些重要数据的初始化。attach 对象中,Activity 还会完成 Window 的创建并建立自己和 Window 的关联,这样当 Window 接收到外部输入事件后就可以将事件传递给 Activity。

    • 第五步,通过 Instrumentation 的 callActivityOnCreate 方法调用 Activity 的 onCreate 方法。完成启动。

    Activity启动过程中的进程变化

    ActivityThread 应用进程,在组件激活的过程中 ActivityThread 中的 ApplicationThread 实例的代理会传递到 AMS 进程,AMS 进程通过 ApplicationThread 的代理的方法将流程转移到应用进程
    当前应用进程主线程 –> AMS 系统进程 –> 通过 app.thread 切换到主进程并通过的 Handler 转移到应用进程主线程。

    展开全文
  • Android Activity启动流程

    2019-04-15 16:46:30
    一上来就总结吧,源码看的累,文末有流程图。 一、总结 Activity启动流程总结起来就两条线: 1、要启动的Activity在不在栈里面,不在顶部...二、在Activity启动过程中需要注意几个点: 1、在server端创建Activity...

    一上来就总结吧,源码看的累,文末有流程图。

    一、总结

    Activity启动流程总结起来就两条线:

    1、要启动的Activity在不在栈里面,不在顶部新建一个,在的话拉起来复活;

    2、要启动的Activity所在进程在不在,不在的话新建进程并新建Activity;进程在,但是Activity不存在就新建一个。

    二、在Activity启动过程中需要注意几个点:

    1、在server端创建Activity的基础数据的时候,需要借助PackageManagerService来选择合适的Activity,比如启动模式,策略等;

    2、新建进程的时候,通过Socket连接创建一个ZygoteConnection句柄,最后运行runOnce方法调回到ActivityThread,开启新建Application和Activity的流程;

    3、流程中左侧两列属于Client端,右边属于Server端,Android的进程通信以Binder作为桥梁。

    三、class分类

    1、Client

    ActivityThread,干活的;

    IActivityManager,接口,定义对Binder的操作;

    ActivityManagerProxy,Binder client端持有对server的代理,实现接口并获取native对象;

    ActivityManagerNative,具体实现,运行onTransact;

    ApplicationThread,实现server对client调用的方法,不过都要通过Handler发给ActivityThread干活,因为这个类在ActivityThread的屋檐下(内部类);

    Instrumentation,傀儡,在合适的时机运行Application,Activity,Service等对应的生命周期;

    LoadedApk,加载apk上下文,生成appContext;

    ContextImpl,为Context服务,主要干活的。

    Activity,界面呈现者;

    Application,先运行,再运行其他的组件。

    2、Server

    ActivityManagerService,核心大佬,负责策略调度;

    ActivityStarter,践行者,启动流程;

    ActivityStackSupervisor,大佬的左膀右臂,比较核心实现都在这个里面;

    ActivityStack,栈的维护及管理;

    IApplicationThread,定义调用client的接口;

    ApplicationThreadProxy,实现接口,client端的代理,并持有native对象;

    ApplicationThreadNative,Binder实际的践行者,运行onTransact;

    Process,创建进程;

    ZygoteState,Zygote状态,与Socket建立连接;

    ZygoteInit,socket server端,创建服务端,并等待连接;

    ZygoteConnection,socket服务端具体实现,运行主体在runOnce方法;

    RuntimeInit,启动进程到这一步就要开始开挂,抛出异常回到ZygoteInit;

    MethodAndArgsCaller,身处ZygoteInit屋檐下,来了异常马上映射调用到ActivityThread,开启Activity新的篇章。

    只贴图,如下:

    The end:

    ActivityManagerService
    清晰图片地址:https://i.loli.net/2019/04/15/5cb438c1ca0ff.jpg

    文章已经同步到微信公众号:Android部落格。

    展开全文
  • Activity启动流程浅析

    2019-04-07 17:22:24
    Activity启动流程的简要时序
  • Activity启动流程比较复杂, 涉及的类及代码都很多, 本文侧重从整体流程描述这个过程,给出关键节点,尽量少的涉及代码细节。 啥也不说了,先上图。 在看本文的内容时, 可以参照此图片进行阅读。 ...
  • android Activity启动流程

    2021-01-03 22:57:40
    Activity启动过程,我们可以从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当AMS...
  •       Activity启动流程源码实现详解(三) Android四大组件源码实现详解系列博客目录: Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,156
精华内容 56,862
关键字:

activity启动流程