自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 Laucher中activtyA启动APP进程中的ActivityB

然后获取socket命令,拿到发送过来的要fork的进程的相关信息,最后通过fork操作得到两个pid。Launcher通过Instrumentation类,在Instrumentation中通过ServiceManager拿到AMS的Binder和AMS通信,调用AMS里面的startActivity方法,同时把Launcher进程的包名和所对应的ApplicationThread(Binder),intent里面所包含的信息全部传递给AMS的ActivityStart里面的静态的Request。

2024-02-03 21:37:56 852

原创 Activity启动流程分析四 ActivtyB的生命周期执行和ActivityA的生命周期执行

我们可以看到onStart生命周期并不是AMS去控制App进程去执行的,AMS只是给了App进程一个ClientTranstion事务,这个事务里面规定了Activity的开始生命周期和结束生命周期,分别是LaunchActivityItem和ResumeActivityItem。AMS在ClientTransaction里面添加了一个起始生命周期和结束生命周期,那么对应的在我们App进程里面的TransactionExecutor事务处理器里面,也是分两步进行。

2024-01-31 16:54:16 937

原创 Activity启动流程分析三 ActivityStackSupervisor启动Activity ClientTransaction在AMS和App之间的通信

ClientTransaction必须要实现Parcelable接口,ClientTransaction里面包含AMS希望App进程的Activity执行的生命周期事件的集合,这些生命周期事件会通过AMS和App进程跨进程通信,把ClientTransaction传递给App进程,最后由App进程执行这些Activity的生命周期事件。在这个函数里面根据栈里面的各种情况去管理启动流程,然后执行源Activity的onPase方法,把onPase包装成一个事务,让源Activity处于可见但不可交互状态;

2024-01-31 14:56:32 959

原创 Activity启动流程分析二 解析Activity启动参数

通过ActivityStartController创建ActivityStarter,并且在ActivityStarter的Request里面保存下来相应的参数后,接下来执行ActivityStart的execute函数,execute会执行executeRequest函数//拿出Request记录的Activity的相关参数//检测判断这些参数是否合规......//创建出我们的目标 ActivityRecord对象,存到传入数组0索引上。

2024-01-30 17:37:47 886

原创 Activity启动流程分析一 总体流程步骤分析

第二步就是在栈中启动activty。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。我们要启动的activity的生命周期肯定是在App进程中执行的,这涉及到AMS和App进程的通信。我们不能直接启动一个activity,首先第一步就是解析要启动activity的启动参数,包括栈信息,启动模式等。

2024-01-30 16:18:54 907

原创 Application启动流程分析二 AMS如何拿到App的Binder,Application生命周期怎么启动的

在存储App的Binder到进程对应的ProcessRecord之前,会执行ActivityThread里面ApplicationThread的bindApplication函数,ApplicationThread就是Binder线程池里面的一个子线程,需要通过sendMessage把相关信息发送到主线程里面去创建Application。可以看到在主线程的handleBindApplication方法里面,通过makeApplication函数,在内部通过反射来创建Application。

2024-01-30 15:27:09 404

原创 Application启动流程分析一 Zygote是如何fork进程的

一个App启动另外一个App不会直接启动Application,而是启动另外一个App的MainActivity。

2024-01-29 22:21:53 954

原创 AMS简单解析

所有在SystemServiceManager启动的服务都需要继承SystemService是因为方便管理,这里的SystemService只是一个普通的java类,不是SystemService进程。还有App运行时的信息,进程信息,图像信息,内存信息,数据库信息,cpu信息,权限管理信息等等(所以AMS在启动的时候会把这一些列信息对应的服务添加到ServiceManager,当App出现问题的时候,我们可以使用adb命令收集这一系列服务的信息,adb调用服务里面的dump方法)。

2024-01-28 23:38:56 852

原创 文字的baseLine算法

top为负数,bottom为正数可以把baseLine当做一个虚拟的x轴,y轴是向下的。y0,y1,y3,y4都是由这个虚拟的两个轴计算得出。比如说y1的值就是y1与baseLine的绝对值。这边的x和y坐标是Baseline的坐标。因为top是负值bottom为正值所以绝对值之后就是bottom-top。bottom:是baseLine到最低字符的最低处的距离 ps:为正值。top:是 baseLine到最高字符的最高处的距离 ps:为负值。基线的位置:控件高度的一半+dy。

2024-01-20 23:00:20 493

原创 View的绘制流程二 requestLayout

若要ViewGroup onDraw()执行,只需要setWillNotDraw(false)、设置背景、设置前景、设置焦点高亮,4个选项其中一项满足即可。当然如果不想在 继承ViewGroup的自定义View onDraw里绘制,也可以重写ViewGroup dispatchDraw()方法,在该方法里绘制 自定义View 内容。

2024-01-20 17:05:57 925

原创 View的绘制流程一 DecorView是什么时候添加到Window上的

ViewRootImpl DecorView怎么添加到View里面去

2024-01-19 23:05:31 435

原创 inflate流程分析

null &&!Class

2024-01-13 13:08:13 947

原创 Android的setContentView流程

1.在ActivityThread的performLaunchActivity里面调用Activity的attach方法,创建PhoneWindow。2.在PhoneWindow里面调用setContentView的installDecor方法里面的generateDecor创建一个DecorView。

2024-01-12 18:05:47 1062

原创 JVM垃圾回收

我们总结一下对象的分配过程,首先我们判断这个对象是否在栈上分配(JIT和逃逸分析),如果不在栈上分配,这个对象是否满足大对象的要求呢?满足就直接分配在老年代了,不满足的话看是否开启本地线程缓冲,开启对象分配在缓冲里面,没有的画分配在Eden里面。当进行一次Minor GC,Eden存活的对象移动到From区域,TO区域清空。多次发送Minor GC且年龄达到要求的对象会移动到老年代里面。有个特殊情况叫动态年龄判断,当From区域该年龄的对象达到From内存的一半或者以上,大于等于该年龄的对象直接进入老年代。

2024-01-08 15:02:16 897

原创 JVM中对象的创建

JVM向操作系统申请内存,初始化运行时数据区,接下来装载使用的类,执行类里面相应方法的时候为当前虚拟机栈压入一个栈帧,方法执行完成后栈帧出栈,进行垃圾回收。

2024-01-07 22:36:27 972 1

原创 JVM内存管理

JVM把我们的字节码翻译成机械能执行的机械码。JRE除了包含JVM之外,还包含很多java的原生依赖库。JDK除了包含JRE之外,还包含很多工具,比如javac工具。

2024-01-06 00:20:09 1948

原创 泛型擦除到底是怎么一回事

众所周知,Java的泛型只在编译时有效,到了运行时这个泛型类型就会被擦除掉,即和在运行时其实都是类型。为什么选择这种实现机制?不擦除不行么?在Java诞生10年后,才想实现类似于C++模板的概念,即泛型。Java的类库是Java生态中非常宝贵的财富,必须保证向后兼容(即现有的代码和类文件依旧合法)和迁移兼容(泛化的代码和非泛化的代码可互相调用)基于上面这两个背景和考虑,Java设计者采取了"类型擦除"这种折中的实现方式。

2024-01-04 17:06:32 1195

原创 如何获取泛型T的真实类型

Type是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java中所有类型的“爹”,它并不是我们平常工作中经常使用的 int、String、List、Map等数据类型,而是从Java语言角度来说,对基本类型、引用类型向上的抽象;

2024-01-04 14:55:37 1377

原创 自定义注解

与声明一个'Class'不同,注解的声明使用@interface关键字。在注解里面可以定义变量,变量可以设置一个默认值,也可以不设置默认值。不设置默认值的时候需要在调用的时候给这个注解的变量塞值。

2024-01-04 14:32:56 816

原创 泛型的使用

泛型最大的好处是实现类型安全,也就是说在编译期就可以检查出类型错误,而不需要等到运行时才发现。

2024-01-01 23:03:41 1037

原创 Activity生命周期

异常情况:当我们从app1打开app2的时候,app2需要内存,而我们系统内存不够的情况下,在后台的app1可能会被系统回收。onCreate: 一般在这个方法中做初始化工作,setContentView,initView,布局的初始化,第三方SDK的初始化等;尽可能在这个方法中做的事情少一点,activity的启动速度会快一些。onStart:onCreate方法执行完成后执行onStart方法,activity是可见的,但是还没得到用户焦点,不能和用户进行交互,也可以做一些初始化工作。

2024-01-01 10:54:21 358

原创 Android中的Intent

显示Intent是明确目标Activity的类名1. 通过Intent(Context packageContext, Class cls)构造方法2.通过Intent的setComponent()方法3.通过Intent的setClass/setClassName方法。

2023-12-31 22:34:46 524

原创 IdleHander

1.Activity启动优化: onCreate, onStart,onResume 中耗时较短但非必要的代码可以放到IdleHandler 中执行,减少启动时间2.想要一个view绘制完成之后添加其他依赖于这个view的view,当然这个view的post方法也能实现,区别就是前者会在消息队列空闲时执行。3.发生一个返回true的idleHandler ,在里面让某个view不停闪烁,这样当用户发吴时就可以诱导用户点击这个view,这也是种很酷的操作。

2023-12-31 19:35:33 370

原创 Handler消息屏障

发送消息从sendEmptyMreeageDelayed到sendMessageDelayed,最后到sendMessageAtTime()方法,把消息传进去之外,还传了消息时间(系统启动时间+用户定义的时长),这个消息时间特别重要。这段代码其实很好理解,第一条消息进来时,P对象为空,mMessages对象也是为空,然后此时p==null成立,因此走if里面的代码块,然后让当前这条要发送的消息的下一个消息对象next引用指向p(也就是null),然后让mMessages等于当前消息对象。

2023-12-31 14:46:12 1013 1

原创 epoll机制

最早的时候,linux的(请求)通知机制是请求方不停地去轮询发送请求,也就是每隔几秒就会发送请求,这种方式太损耗发送方的性能和资源了。于是就改为第二种方式,也就是当请求方发送请求之后,就会阻塞:一直等待接收方,直到接收方把相应数据消息返回回来,发送方才关闭请求。

2023-12-31 13:17:33 389

原创 Handler对message的管理为什么使用享元设计模式

享元模式是一种结构型的设计模式。它的主要目的是通过共享对象来减少系统种对象的数量,其本质就是缓存共享对象,降低内存消耗。

2023-12-24 22:10:39 418

原创 应该如何在子线程准确创建Handler

我们已经知道Handler发送消息,处理消息的机制了。ActivityThread在main方法中,为当前线程创建一个looper,一个messagequeue,并且通过调用Looper的loop方法,开启死循环不断地从messagequeue里面去取消息。当handler通过sendmessage的方法把消息添加到消息队列中,主线程的死循环就会拿到消息,进而做一系列的事情。通常是在主线程中调用handler的改造函数,创建一个匿名内部类。那么在子线程中该如何new 一个handler并且让他正常工作呢。

2023-12-24 20:38:50 1465

原创 Handler为什么会导致内存泄漏?其他的内部类没有这个问题?

在ActivityThread的main方法里面调用 Looper.loop()执行死循环,死循环首先执行Message msg = queue.next(),只有拿到对应msg后,才会执行handler的dispatchMessage方法,最后处理完消息后执行message的recycleUnchecked方法,target = null,message持有的handler采会被释放。我们已经知道了Handler是匿名内部类,匿名内部类持有外部类的对象,handler持有activity。

2023-12-21 20:47:01 957

原创 Handler是怎么实现跨线程通信的

Handler的消息发送,和消息获取机制

2023-12-20 22:32:07 1108

原创 APP的Activity是怎么启动的

小结:ZygoteInit创建出SystemServer进程后就一直在循环等待AMS的消息,AMS通过socket发送消息给zygote进程后,在ZygoteServer里面的死循环就会接受到消息执行processOneCommand函数,先拿到AMS通过socket发送过来的消息argv,然后调用Zygote.forkAndSpecialize函数fork出一个子进程得到这个进程的pid,此时app进程已经被启动了。SystemServer进程和app进程是两个不同的进程,不能直接通信,需要跨进程通信。

2023-12-20 00:26:44 798

原创 Zygote启动流程分析

zygote启动流程

2023-12-15 23:49:42 1233

原创 Android APP启动流程分析梳理

Android App启动流程分析

2023-12-14 22:28:12 251

原创 Android外部唤醒APP跳转指定页面

Android外部链接唤醒APP原理新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入原理通过scheme协议来唤醒APP。1.定义一个相应外部链接的Activity,在由这个activity来判断app是否在后台运行,

2021-11-13 15:21:18 3746

原创 kotlin语言中Toast使用

一.普通使用Toast.makeText(this, "Androidly Short Toasts", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Androidly Long Toasts", Toast.LENGTH_LONG).show();1.这里的this代表的是content环境2.如果字符串定义在values文件夹的strings.xml文件中,通过使用R.id.字符串名字这种形式来进行对字符串的调用3.Toast.LE

2021-08-08 21:16:24 4304

原创 关于Android Studio中Gradle的升级

gradle版本在升级过程中会解决以往的bug,所以我们最好把gradle升级到最新版本1.查看自己gradle版本打开Android studio,在gradle文件夹中打开gradle-wrapper.propertios文件,我们可以在最末尾看见自己的gradle版本2.查看最新版本并且修改我们打开https://services.gradle.org/distributions/这个网站,在里面查看最新的gradle版本,发现目前最新版本为gradle-7.1-rc-1-all.zip,我

2021-06-05 23:25:02 12092 7

原创 BottomNavigationView+ViewPager+Fragment 底部导航按钮 kotlin版本

1.BottomNavigationView的使用首先在MainActivity的布局中加入BottomNavigationView如下:<com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/bottom_nav_view"android:layout_width=“match_parent”android:layout_height=“wrap_content”android

2020-11-13 17:52:49 903 7

原创 实习期间笔记收获

实习期间笔记收获/java中instanceofjava 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。用法:result = object instanceof class参数:Result:布尔类型。Object:必项。任意对象表达式。Class:必选项。任意已定义的对象类。说明:如果 object 是 class 的一个实例,则 instanceof 运算

2020-10-19 11:05:53 131

原创 自定义View一些简单操作

1.自定义View简介  自定义View可以认为继承自View,系统没有的效果(ImageView,TextView,Button), extends View , extends ViewGroup自定义一个系统的TextView,自定义View入门(今天,明天)2.onMeasure()// 获取宽高的模式int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 获取前两位int heightMode = MeasureSpec.getM

2020-07-06 21:01:08 168

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除