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启动相关类的类图
Android 启动过程Activity 启动源码分析 ( ActivityThread 流程分析 二 )