Android中perform和handle方法的区别——以handleLaunchActivity与performLaunchActivity为例
在Android系统中,perform
和handle
方法经常出现在关键流程中,分别承担不同的职责。这种命名约定反映了框架设计中的分层思想,帮助开发者区分任务的调度与实现。本文通过handleLaunchActivity
和performLaunchActivity
这两个典型方法的源码分析,详细讲解它们的区别和设计意图。
1. 核心概念
-
perform
方法:- 用于具体执行某项任务的逻辑。
- 专注于任务实现的细节,例如初始化、计算或生命周期处理。
-
handle
方法:- 负责响应事件或调度任务,是流程控制的入口。
- 通常包含任务分发或异常处理的逻辑。
总结: perform
专注于实现任务,handle
专注于管理任务的流程。
2. 应用场景简介
handleLaunchActivity
和performLaunchActivity
是ActivityThread
中两个核心方法,用于启动Activity。
-
handleLaunchActivity
:启动流程的调度者,负责组织和管理任务。 -
performLaunchActivity
:任务的执行者,负责Activity实例化和初始化的具体逻辑。
3. 源码分析
以下从源码角度说明这两个方法的职责分工和调用关系。
(1) handleLaunchActivity
源码(ActivityThread.java
):
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {// 处理启动前的状态unscheduleGcIdler();r = performLaunchActivity(r, customIntent); // 调用 perform 执行具体任务if (r != null) {Activity a = r.activity;if (a != null) {// 启动完成后更新状态handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished, r.lastProcessedSeq);}} else {// 启动失败处理throw new RuntimeException("Unable to start activity ComponentInfo{"+ r.intent.getComponent().toShortString() + "}: "+ "activity returned null from performLaunchActivity");}}
职责:
- 调度和管理Activity启动流程。
- 调用
performLaunchActivity
完成具体的Activity初始化任务。 - 在任务完成后更新状态,或者处理启动失败的情况。
(2) performLaunchActivity
源码(ActivityThread.java
):
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {// 获取组件信息并加载 Activity 类ContextImpl appContext = createBaseContextForActivity(r);Activity activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);if (activity != null) {appContext.setOuterContext(activity);// 初始化 Activity 的 Context 和资源activity.attach(appContext, this, getInstrumentation(), r.token, ...);activity.onCreate(r.state); // 调用生命周期方法}return activity;}
职责:
-
执行具体的Activity初始化逻辑,包括:
- 加载Activity类。
- 创建Activity实例并绑定上下文。
- 调用生命周期方法
onCreate
。
-
返回初始化完成的Activity实例。
4. 区别对比
通过源码分析可以看出,两者在职责和调用上的显著区别:
维度 | handleLaunchActivity | performLaunchActivity |
---|---|---|
功能定位 | 启动流程的入口,组织和管理整个任务 | 执行具体的Activity初始化逻辑 |
调用关系 | 调用performLaunchActivity 处理具体任务 | 被handleLaunchActivity 调用 |
职责范围 | 粗粒度,包含任务调度与状态管理 | 细粒度,专注于任务的执行 |
异常处理 | 负责任务失败后的回滚和流程恢复 | 不处理异常,仅专注于分配的任务 |
5. 图解调用关系
下图展示了handleLaunchActivity
与performLaunchActivity
之间的调用关系:
+----------------------------+| handleLaunchActivity() | <-- 调度任务的入口| - 调用 performLaunchActivity() || - 管理流程状态 |+----------------------------+|v+----------------------------+| performLaunchActivity() | <-- 专注于具体逻辑的执行| - 实例化 Activity || - 调用生命周期方法 |+----------------------------+
6. 设计意义与使用建议
-
分层设计:职责单一化
-
handle
方法聚焦流程控制,不直接实现具体逻辑,保证代码结构清晰。 -
perform
方法专注于实现某一具体任务,避免流程逻辑过于复杂。
-
-
异常与状态管理
-
handle
方法需要负责处理perform
方法的异常和任务失败后的回滚操作。 - 开发中建议为
perform
方法添加保护性调用机制,避免影响整体流程。
-
-
实践经验
-
在设计复杂流程时,建议模仿Android的这种分层设计:
- 使用
handle
方法作为调度入口。 - 将任务的具体实现封装到
perform
方法中。
- 使用
-
7. 总结
perform
和handle
方法的命名规范体现了Android框架设计中的分层思想:
-
perform
方法专注于细粒度的具体任务实现,是执行者。 -
handle
方法负责流程的组织和调度,是调度者。
通过合理区分两者的职责,可以提升代码的可维护性、可扩展性以及团队协作效率。以handleLaunchActivity
和performLaunchActivity
为例,Android框架设计展示了如何在复杂的任务管理中清晰划分逻辑,让开发者受益良多。
相关文章:
Android中perform和handle方法的区别——以handleLaunchActivity与performLaunchActivity为例
在Android系统中,perform和handle方法经常出现在关键流程中,分别承担不同的职责。这种命名约定反映了框架设计中的分层思想,帮助开发者区分任务的调度与实现。本文通过handleLaunchActivity和performLaunchActivity这两个典型方法的源码分析&…...

聊聊依赖性测试
在软件测试中,我们常常面临一个挑战:多个模块之间高度耦合,任何一个模块的异常都可能导致整个系统崩溃。如何确保这些模块之间的协作无缝衔接?这就需要依赖性测试的助力! 什么是依赖性测试?它与功能测试、…...

C++11————线程库
thread 类的简单介绍 在 c11 之前,涉及到多线程问题,都是和平台相关的,比如 windows 和 linux 下各自有自己的接口,这使得代码的可移植性比较差。在 c11 中引入了线程库,使得 c在编程时不需要依赖第三方库了 函数名 …...
Java 动态代理初步
动态代理初步 package ReflectExercise;import ReflectExercise.pojo.BigStar; import ReflectExercise.pojo.ProxyUtil; import ReflectExercise.pojo.Star;/*** 动态代理* 无侵入的给方法增强功能*/ public class ReflectExercise {public static void main(String[] args) {…...

应用系统开发(10) 钢轨缺陷的检测系统
涡流检测系统框图 其中信号发生器为一定频率的正弦信号作为激励信号,这个激励信号同时输入给交流电桥中的两个检测线圈,将两个线圈输出的电压差值作为差分信号引出至差分放大电路进行放大,经过放大后信号变为低频的缺陷信号叠加在高频载波上…...
理解 \r、\n、\r\n 和 \n\r:换行符的区别和用法
\r(回车,Carriage Return): ASCII 码 13,对应的控制字符是 CR,将光标回到当前行的行首(而不会换到下一行),之后的输出会把之前的输出覆盖。\n(换行,Line Feed)…...
【jvm】StringTable为什么要调整
目录 1. 永久代内存限制与回收效率2. 堆内存的优势3. JDK版本的演进4. 实际应用的考虑 1. 永久代内存限制与回收效率 1.内存限制:在JDK 6及之前的版本中,StringTable位于永久代(PermGen space)中。然而,永久代的内存空…...
AI 驱动低代码平台:开创智能化用户体验新纪元
一、引言 人工智能技术如汹涌浪潮般迅猛发展,在各个行业掀起了颠覆性的变革风暴。于软件开发领域而言,AI 辅助编程与低代码平台的完美结合已然成为关键趋势,极大地提高了开发效率。然而,低代码平台的使命绝非仅仅局限于简化开发流…...

谈一谈QThread::CurrentThread和this->thread
QThread::CurrentThread是指的当前函数调用者者所在的线程 this->thread是指的当前对象所在的线程(对象创建出来的时候所在的线程) Qt文档说明 CurrentThread返回一个指向管理当前执行线程的QThread的指针 thread返回对象所在的线程 这两个函数所…...

ThriveX 博客管理系统前后端项目部署教程
前端 前端项目地址:https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址:https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署,两种方式部署都是一样的,我们以前端项目进行演示 首先我们先…...

STM32单片机设计防儿童人员误锁/滞留车内警报系统
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 近年来在车辆逐渐普及的情况下,由于家长的疏忽,将…...

可认证数据资产合约标准协议(CMIDA-1)意见征集
标准背景 数据资产具备多维度的属性,涵盖行业特性、状态信息、资产类型、存储格式等。数据资产在不同流通主体之间可理解、可流通、可追溯、可信任的重要前提之一是存在统一的标准,缺失统一的标准,数据混乱冲突、一数多源、多样多类等问题将…...

Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件
本文将介绍一种手动的轻量级的方式,还原HTTP/TLS协议中传输的文件,为流量数据包中的文件分析提供帮助。 如果捕获的数据包中存在非文本类文件,例如png,jpg等图片文件,或者word,Excel等office文件异或是其他类型的二进…...
MYSQL- 展示事件信息 EVENTS 语句(十八)
13.7.5.18 SHOW EVENTS 语句 SHOW EVENTS[{FROM | IN} schema_name][LIKE pattern | WHERE expr]此语句显示有关事件管理器事件的信息,这些信息在第23.4节“使用事件调度器”中进行了讨论。它要求显示事件的数据库具有EVENT权限。 以最简单的形式,SHOW…...

如何在react中使用react-monaco-editor渲染出一个编辑器
一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件(此处是tsx、直接用app或者jsx也行) import { useState, useEffect } from react impo…...

【Linux】Github 仓库克隆速度慢/无法克隆的一种解决方法,利用 Gitee 克隆 Github 仓库
Github 经常由于 DNS 域名污染以及其他因素克隆不顺利。 一种办法是修改 hosts sudo gedit /etc/hosts加上一行 XXX.XXX.XXX.XXX github.comXXX 位置的 IP 可以通过网站查询 IP/服务器github.com的信息-站长工具 这种方法比较适合本身可以克隆,但是速度很慢的…...

HarmonyOS Next 组件或页面之间的所有通信(传参)方法总结
系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 【…...

单片机学习笔记 1. 点亮一个LED灯
把基础的东西都过一下,用来学习记录一下。 目录 1、Keil工程 2、Keil实现代码 3、烧录程序 0、实现的功能 点亮一个LED灯 1、Keil工程 打开Keil,Project----New uVision Project,工程文件命名----OK 选择单片机类型AT89C52,和…...
Poetry 完整安装与项目环境搭建指南
Poetry 完整安装与项目环境搭建指南 1. Poetry 安装方式 1.1 pip 安装(推荐新手使用) # 使用 pip 安装 pip install poetry# 验证安装 poetry --version# 如果需要升级 pip install --upgrade poetry1.2 官方安装脚本 # Windows PowerShell (Invoke-…...
【MyBatis源码】MapperRegistry详解
🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 MapperRegistry 的作用核心字段解析整体工作流程addMapper方法MapperAnnotationBuilder#parse流程详解MapperAnnotationBuilder#parse…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...