activity的启动流程(三)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activity的启动流程(三)相关的知识,希望对你有一定的参考价值。

参考技术A activity的启动流程(一)
activity的启动流程(二)
activity的启动流程(三)

从ApplicationThread到真正启动一个Activity流程如下:

AMS 将启动 Activity 的任务作为一个事务 ClientTransaction 去完成,在 ClientLifecycleManager 中会调用 ClientTransaction的schedule() 方法,如下:

mClient的定义如下:

mClient 是一个 IApplicationThread.aidl

接口类型,具体实现是 ActivityThread.java
的内部类 ApplicationThread。
因此后续执行 Activity 生命周期的过程都是由 ApplicationThread 指导完成的,scheduleTransaction 方法如下:

可以看出,这里还是调用了ActivityThread 的 scheduleTransaction 方法。
但是这个方法实际上是在 ActivityThread 的父类 ClientTransactionHandler.java
中实现,具体如下:

其中执行了sendMessage函数,向 Handler 中发送了一个 EXECUTE_TRANSACTION 的消息,并且 Message 中的 obj 就是启动 Activity 的事务对象。

这个 Handler 的具体实现是 ActivityThread 中的 mH 对象。删减后如下:

最终调用了TransactionExecutor类的 execute 方法,execute 方法如下:

在 executeCallback 方法中,会遍历事务中的 callback 并执行 execute 方法。

这些 callbacks 是何时被添加的呢?

定位callbacks : ActivityStackSupervisor.java

添加的callback为LaunchActivityItem,看一下LaunchActivityItem的execture函数:

主要执行了ActivityThread中handleLaunchActivity函数。

其中调用 WindowManagerGlobal.initialize() 创建一个activity对应的窗口,然后进入 final Activity a = performLaunchActivity(r, customIntent) 函数中创建并显示 Activity。

至此,目标 Activity 已经被成功创建并执行生命周期方法。

Activiti 学习—— Activiti 流程启动并完成


Activiti 流程启动

流程定义部署后,就可以通过工作流管理业务流程了,也就是说前文部署的出差申请流程可以使用了。针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要创建一个对象使用,也可以创建多个对象。对于出差申请流程,张三发起一个出差申请单需要启动一个流程实例,李四发起一个出差申请单也需要启动一个流程实例

Activiti 流程启动主要有两种方式,分别是根据 processDefinitionKey 启动和根据 processDefinitionId 启动

1. 根据 processDefinitionKey 启动

processDefinitionKey 就是 act_re_procdef 表的 KEY_ 字段的值,是对应的流程定义的 key

@Test
public void testStartProcess() {
    // 1. 创建 ProcessEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 RuntimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 3. 根据 processDefinitionKey 启动流程
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("evection");
}

2. 根据 processDefinitionId 启动

processDefinitionId 就是 act_re_procdef 的主键 ID 例如 evection:1:22503

@Test
public void testStartProcess() {
    // 1. 创建 ProcessEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 RuntimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 3. 根据 processDefinitionKey 启动流程
    ProcessInstance instance = runtimeService.startProcessInstanceById("evection:1:22503");
}

Activiti 个人任务查询

流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务

public void testFindPersonTaskList() {
    // 1. 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 taskService
    TaskService taskService = processEngine.getTaskService();
    // 3. 获取流程 key 和任务的负责人,查询任务
    List<Task> taskList = taskService.createTaskQuery()
        .processDefinitionKey("evection")   // 流程key
        .taskAssignee("zhangsan")   // 要查询的负责人
        .list();
    // 4. 输出
    for (Task task : taskList) {
        System.out.println("流程实例 id = " + task.getProcessInstanceId());
        System.out.println("任务 id = " + task.getId());
        System.out.println("任务负责人 = " + task.getAssignee());
        System.out.println("任务名称 = " + task.getName());
    }
}

Activiti 完成个人任务

根据任务 id,也就是 查找任务并处理

public void completeTask() {
    // 1. 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 TaskService
    TaskService taskService = processEngine.getTaskService();
    // 3. 根据任务id 完成任务
    taskService.complete("25005");
}

每次都要查找任务 id 很麻烦,一般来说,是任务负责人查询待办任务,选择任务进行处理,完成任务,那我们就能根据任务负责人和任务 key 来查找任务并完成

public void completeTask() {
    // 1. 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 TaskService
    TaskService taskService = processEngine.getTaskService();
    // 3. 获取 jerry - evection 对应的任务
    Task task = taskService.createTaskQuery()
        .processDefinitionKey("evection")
        .taskAssignee("jerry")
        .singleResult();
    // 4. 根据任务 id 完成任务
    taskService.complete(task.getId());
}

以此类推,直至整个出差流程完成


以上是关于activity的启动流程(三)的主要内容,如果未能解决你的问题,请参考以下文章

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

Activity启动流程分析

Android 启动过程Activity 启动源码分析 ( ActivityThread 流程分析 二 )

Android 启动过程Activity 启动源码分析 ( ActivityThread 流程分析 一 )

Activity的启动流程

流程引擎之Camunda开发记录(三)