从源码到原理剖析activity核心知识点

在这里插入图片描述

  • 如何在onResume方法中获取到View的宽高?
    有两种方式:post和addOnGlobalLayoutListener
    override fun onResume() {super.onResume()Log.e("onresume",tabBottom.width.toString()+"--"+tabBottom.height.toString())//view.post之所以能够拿到宽高,是因为在绘制之前,会将获取宽高的任务放到Handler的消息队列,等到View的绘制结束之后,便会执行。tabBottom.post {Log.e("onresume:post",tabBottom.width.toString()+"--"+tabBottom.height.toString())}tabBottom.viewTreeObserver.addOnGlobalLayoutListener {tabBottom.viewTreeObserver.removeOnGlobalLayoutListener{this}//防止被多次绘制Log.e("onresume:viewTreeObserver",tabBottom.width.toString()+"--"+tabBottom.height.toString())}}
  • 为什么无法在onCreate或onResume方法中获取到View的宽高?
    因为这个时候view的绘制流程还没有开始。要拿到View的宽高,那么View的绘制流程(measure—layout—draw)至少要完成measure阶段。
    有看过onCreate方法源码的同学应该知道:

    • onCreate流程中的setContentView只是解析了xml,初始化了DecorView,创建了各个控件的对象;即将xml中的 转化为一个TextView对象。并没有启动View的绘制流程。
    • 调用performResumeActivity, 该方法中r.activity.performResume(r.startsNotResumed, reason);会调用Activity的onResume方法。执行完Activity的onResume后调用了wm.addView(decor, l);,到这里,开始将此前创建的DecorView添加到视图中,也就是在这之后才开始布局的绘制流程,真正开始是在ViewRootImpl类里面的。
  • 子线程中真的不能更新UI吗?
    各位读者可以参考这篇博客:https://www.jianshu.com/p/fbd748a533e1

  • 接下来,我们来认识下ViewRootImpl类的相关功能:
    在这里插入图片描述

  • View的三大流程主要涉及到的核心类,笔者列在下面了:
    在这里插入图片描述

  • 手势分发
    在这里插入图片描述
    具体逻辑可以参考靠=笔者之前写的博客:https://blog.csdn.net/qq_36828822/article/details/103658941

  • 如何获取栈顶的activity以及监听activity前后台切换

总所周知:Android的sdk并没有提供相关的api。那么,我们如何设计一个管理任务栈的工具类呢?

package com.example.myapplication.demoimport android.app.Activity
import android.app.Application
import android.app.Application.ActivityLifecycleCallbacks
import android.os.Bundle
import java.lang.ref.WeakReferenceclass ActivityManager private constructor() {private val activityRefs = ArrayList<WeakReference<Activity>>()private val frontbackCallback = ArrayList<FrontBackCallback>()private var activityStartCount =0private var front = truefun init(application: Application){application.registerActivityLifecycleCallbacks()}inner class InnerActivityLifecycleCallbacks:ActivityLifecycleCallbacks{override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {activityRefs.add(WeakReference(activity))}override fun onActivityStarted(activity: Activity) {activityStartCount++//activityStartCount>0 说明应用处于可见状态,也就是应用在前台//!front 之前是不是在后台if(!front && activityStartCount>0){front = trueonFrontBackChanged(front)}}override fun onActivityResumed(activity: Activity) {}override fun onActivityPaused(activity: Activity) {}override fun onActivityStopped(activity: Activity) {activityStartCount--;if(activityStartCount<=0&&front){front = falseonFrontBackChanged(front)}}override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}override fun onActivityDestroyed(activity: Activity) {for (activityRef in activityRefs){if(activityRef!=null && activityRef.get()==activity){activityRefs.remove(activityRef)break}}}}private fun onFrontBackChanged(front: Boolean){for (callback in frontbackCallback){callback.onChanged(front)}}val topActivity:Activity?get() {if (activityRefs.size<=0){return null}else{return activityRefs[activityRefs.size-1].get()}return null}fun addFrontBackCallback(callback: FrontBackCallback){frontbackCallback.add(callback)}fun removeFrontBackCallback(callback: FrontBackCallback){frontbackCallback.remove(callback)}interface FrontBackCallback {fun onChanged(front: Boolean)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618750.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode3. 无重复字符的最长子串(滑动窗口 - java)

滑动窗口 无重复字符的最长子串滑动窗口 上期经典 无重复字符的最长子串 难度 - 中等 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc…

软件设计师学习笔记7-输入输出技术+总线+可靠性+性能指标

目录 1.输入输出技术 1.1数据传输控制方式 1.2中断处理过程 2.总线 3.可靠性 3.1可靠性指标 3.2串联系统与并联系统 3.3混合模型 4.性能指标 1.输入输出技术 即CPU控制主存与外设交互的过程 1.1数据传输控制方式 (1)程序控制&#xff08;查询&#xff09;方式&…

工业互联网标识解析与标识服务机构服务能力成熟度等级评估管理平台【需求规格说明书/用户手册】

记录一下我写的文档&#xff0c;应该不会有人看吧。 工业互联网标识解析标识服务机构服务能力成熟度等级评估管理平台&#xff08;ISCA&#xff09; 目录 一、概述 1.项目背景 2.项目目的 3.用户对象 二、前台功能需求 1. 注册登录 1.1 登录 1.2 忘记密码 1.3 注册 …

Windows 10 下 安装 VMware16 +Centos 7 采用 NAT 方式实现访问外网 及 ssh 方式远程访问

文章目录 一. 准备工作二. 配置步骤1. 主机window 设置2. VMware设置3. SHH 远程登录连接配置 一. 准备工作 首先本机先安装VMware16 及下载好 Centos 7 镜像文件&#xff0c;并安装好系统。Vmware—桥接、NAT以及仅主机模式的详细介绍和区别 VMware虚拟机有4种网络连接模式&a…

win8系统计算机的系统属性,Win8系统优化之最详篇 必看!

用户们想到了采用优化软件优化电脑的手段。不过不少用户在使用了目前市面上的大多数优化软件后&#xff0c;会发觉经过优化后的Windows 8会出现各种莫名其妙的问题&#xff0c;比如开始屏幕消失、应用商店无法安装软件等&#xff0c;有些问题甚至导致用户需要重装系统才能解决。…

Kotlin数据结构

数据结构基础 什么是数据结构 在计算机科学中&#xff0c;数据结构&#xff08;Data Structure&#xff09;是计算机中存储、组织数据的方式。数据结构是各种编程语言的基础。 一些使用场景 不同的数据结构适用于不同的应用场景。比如HashMap与ConcurrentHashMap&#xff0…

哪些自主品牌「霸榜」30万元向上战场?硬派越野/MPV再助力

占乘用车市场不到20%份额的30万元以上价位&#xff0c;一直以来都是合资品牌的天下。现在&#xff0c;三家中国本土自主品牌已经率先突围。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-7月&#xff0c;理想、比亚迪、蔚来进入30万元以上价位新车交付量TOP10&#xff…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

多线程学习之解决线程同步的实现方法

一、卖票的多线程实现 需求&#xff1a;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 代码实现&#xff1a; /*** Author&#xff1a;kkoneone11* name&#xff1a;SellTicket1* Date&#xff1a;2023/8/26 11:32*/ public class S…

设计模式之八:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合&#xff08;Collection&#xff09;&#xff0c;比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象&#xff0c;则需要知道具体是存在什么数据结构中&#xff08;如栈就用peek&#xff0c;数组[]&#xff09;。迭代器…

占领手机,银行App的隐秘战事

作者 | 辰纹 来源 | 洞见新研社 十几年前&#xff0c;银行用各类卡片塞满我们的钱包&#xff1b;如今&#xff0c;银行用各种App塞满我们的手机。 说出来可能很多人还不相信&#xff0c;民商智慧《2019银行业电子银行场景营销分析报告》就提到&#xff0c;在2019年3月时&…

Nginx详解 一:编译安装Nginx和Nginx模块

文章目录 1.HTTP 和 Nginx1.1 Socket套接字1.2 HTTP工作机制1.2.1一次http事务1.2.2 资源类型1.2.3提高HTTP连接性能 2. I/O模型2.1 I/O模型相关概念2.2 网络I/O模型2.2.1 **阻塞型** **I/O** 模型&#xff08;blocking IO&#xff09;2.2.2 **非阻塞型** **I/O** **模型** **(…

android 系统(20)---背光灯

图1 这是MTK 2011年的图&#xff0c;下面给出MT6575/6577中此部分的框架图&#xff1a; 图2 再来看更体现一些细节的框架图&#xff1a; 图3 由此可见光系统从上到下依次分为java APP层、java 框架层、本地层和驱动层。下面就来看APP层&#xff0c;先给出调节背光的应用界面…

Ubuntu16.04设置背光灯发亮快捷键

Ubuntu16.04设置背光灯发亮快捷键 分三步&#xff1a; 1.新建根目录 mkdir ~/bin2编辑背光灯控制开关的脚本文件 vim ~bin/ledctrl将以下内容复制 #!/bin/bash - # # # FILE: ledctrl # # USAGE: ./ledctrl # # DESCRIPTION: # # OPTIONS: …

Linux c++开发-02-g++命令行编译

有如下的文件目录结构 格式一 swap.h swap.cpp main.cpp 编译方法和结果如下&#xff1a; 格式二 swap.cpp main.cpp 使用命令&#xff1a;g main.cpp src/swap.cpp -o main.exe 解决方法使用参数 -I 格式三-将swap.cpp生成一个静态库然后链接到main.cpp中 生成…

C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

全文目录 前言fseek 重定位位置指示器函数ftell 获取当前文件指示器的位置rewind 重置位置指示器文本文件和二进制文件文件读取结束的判定feof 和 ferror 文件缓冲区总结 前言 有了文件的顺序读写基础&#xff0c;那么肯定会好奇文件的随机读写&#xff0c;毕竟顺序读写对于有…

python抢票开发——设备预约助手实现

女朋友是药学院的&#xff0c;做实验时需要在特定的网站上进行设备预约&#xff0c;由于预约人数过多&#xff0c;从而导致从浏览器登录不进去或者登录进去预约失败等情况&#xff0c;所以我用python帮她写了一个抢位助手&#xff0c;让程序自动去进行位置预定&#xff0c;实测…

春节Python抢票神器,支持候补抢票真的无敌了

想要回家的小伙伴们,大概经历了一波抢票大战。 一年一度春运着实让人难熬 这次顺便把一个Python抢票工具,送到了GitHub趋势榜第一。 项目名很干脆,就是12306,来自名叫文贤平的程序员。 这很可能是全GitHub最德高望重的购票小助手了,功能一直在更新,且现已支持Python …

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中&#xff0c;IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据&#xff0c;平日开发中在文件读写&#xff0c;网络通信&#xff0c;特定场景的数据库…

老话题,火车票抢票助手,简化版 (漏洞已经失效^_^)

用了“二杠”兄弟的工具测试了抢票&#xff0c;先举个大拇指。牛&#xff01;可是我实在看不惯他画的界面&#xff0c;而且需要认证和访问他服务器上的wcf服务。看到许多园友都号称“破解”了。我也请出"Reflector"神器&#xff0c;尝试了下。发现把源exe文件作为app…