Activity启动过程(startActivity)的源代码分析

Activity启动过程(startActivity)的源代码分析,第1张

1. 从 Activity 本地调用startActivity()-->Activity#startActivityForResult()

2. Instrumentation #execStartActivity:Instrumentation类相当于一个管家,它的职责是管理各个应用程序和系统的交互,Activity都有此对象的实际引用,可以通过它监测系统与应用程序之间的所有交互。

3. ActivityManagerProxy #startActivity():发起了一次跨进程调用,ActivityManagerService是ActivityManagerNative的具体实现。

4. ActivityStarter ():主要负责处理Activity的Intent和Flags, 还有关联相关的Stack和TaskRecord。

ActivityStack.startActivityMayWait():获取Activity的启动信息,包括ResolveInfo和ActivityInfo,以及获取CallingPid和CallingUid;

ActivityStack.startActivityLocked():创建一个ActivityRecord;

ActivityStack.startActivityUnchecked():设置TaskRecord, 完成后执行ActivityStackSupervisor类团晌的resumeFocusedStackTopActivityLocked方法

5. ActivityStackSupervisor 和 ActivityStack :这里会判断进程是否存在和一些生命周期的方法

ActivityStackSupervisor#resumeFocusedStackTopActivityLocked()

  -->ActivityStackSupervisor#resumeTopActivityUncheckedLocked():

    -->ActivityStack#resumeTopActivityInnerLocked()

      -->ActivityStackSupervisor#startSpecificActivityLocked()

6: ApplicationThread :IApplicationThread的直接实现,发起了一次跨进程调用

7: ActivityThread :会调用sendMessage,最后调用到mH.sendMessage(msg)

8: ActivityThread # performLaunchActivity ():会收集要启动的Activity的相关信息,主要是package和component信息,然后通过ClassLoader将要启动的Activity类加载出来搭磨。最后调用mInstrumentation.callActivityOnCreate()

9: Activity # performStart ():Activity的生命周期方法是通过Instrumentation类调用callActivityOnXXX方法最终调用Activity的onCreate等方法,调用时机为ActivityThread#performLaunchActivitiy()方法中。

一. 应用程序的MainActivity通过Binder进程间通信机制通知ActivityManagerService,它要启动一个新的Activity;

二. ActivityManagerService通过Binder进程间通信机制通知MainActivity进入Paused状态;

三. MainActivity通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就准备要在MainActivity所在的进程和任务塌枝锋中启动新的Activity了;

四. ActivityManagerService通过Binder进程间通信机制通知MainActivity所在的ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动 *** 作了。

Instrumentation : 监控应用与系统相关的交互行为。

AMS :组件管理调度中心,什么都不干,但是什么都管。

ActivityStarter :处理Activity什么时候启动,怎么样启动相关问题,也就是处理Intent与Flag相关问题,平时提到的启动模式都可以在这里找到实现。

ActivityStackSupervisior :这个类的作用你从它的名字就可以看出来,它用来管理Stack和Task。

ActivityStack :用来管理栈里的Activity。

ActivityThread :最终干活的人,是ActivityThread的内部类,Activity、Service、BroadcastReceiver的启动、切换、调度等各种 *** 作都在这个类里完成。

在一个流程流转的过程中,可能已经经过多个节点,或者正在停留在某个任务节点。那么我们如何直观的显示当前流程已经完成了哪些节旦模圆点,或者此时当前流程流转到了哪里?那么这里就用到了activiti提供的图片生成器ProcessDiagramGenerator。使用它可以对流程中的节点或者连线等进行高亮标识(也就是用模塌显著的颜色圈起来)后生成图片的输入流,当然也可以对流程图中各个节点的图标,字体之类进行设置。

如果默认的图片生成器满足不了我们的业务需求,比如我要求用户任务被标注高亮的时候颜色使用蓝色或者其他颜色,我想要图片中显示的字体是黑体、楷体?那么如果是这样应该怎么实现呢?

自定义类继承DefaultProcessDiagramCanvas,这里 业务需求是连线标注为蓝色 所以需要重写drawConnection方法, 只需要修改 当highLighted为true时,调用this.g.setPaint()参数为连线的颜色。

2. 扩展DefaultProcessDiagramGenerator,当initProcessDiagramCanvas时候,使用自定义的ProcessDiagramCanvas, 只需要修改initProcessDiagramCanvas方法中最后一行为创建我们自定义的initProcessDiagramCanvas

注意: 这里必须同时定义generateProcessDiagram方法,实码销现与DefaultProcessDiagramGenerator中的实现相同。如果不定义,程序依然会调用DefaultProcessDiagramGenerator中的generateProcessDiagram方法生成默认的DefaultProcessDiagramCanvas

3. 使用自定义图片生成器进行流程运转图的生成

- 生成结果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12363302.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存