自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android知识体系架构综合梳理(大纲)+常见java、Android面试题

虚拟机jvmdalvik+JITart+AOT内存dalvik内存(即java内存)heap(堆内存):线程共享区域存储数据类型内存释放stack(栈内存):线程私有区域存储数据类型内存释放方法区:线程共享区域存储数据类型特殊类型String字面量形式创建使用new创建native内存JNI如何生成.so如何使用.so问题:Android的java程序为什么容易出现OOM?如何解决OOMAndroid内.

2021-04-09 17:25:02 835 4

原创 常用书签.

常用书签

2022-08-07 16:58:00 560 1

原创 git常见使用

仓库关联1,新建远程仓库:Test(会生成readme和gitignore文件),或者不生成,就不会有下面本地和远程冲突问题2,新建本地项目:Test(会生成java文件,本地和远程不一致)2.1,git init(对应VCS->Import into VC->Create git Repository)2.2,git config user.email user.name(对应设置->Version Control->Github)(或者不同仓库不同账号:git con

2021-08-12 16:23:22 140

原创 adb常见命令(工具)

查看当前显示的应用信息1、显示界面全限定类名adb shell dumpsys window | findstr mCurrentFocus2、显示界面包括view树等详细信息adb shell dumpsys activity top3、显示界面Intent// 搜索 intent.actionadb shell dumpsys activity activities启动时间adb shell am start -W com.demo.test/.ui.activity.MainA

2021-08-12 16:18:51 1069

原创 安卓基础使用案例

从A应用打开B应用(scheme)A:String url = "scheme://mtime/goodsDetail?goodsId=10011002";Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(intent);B:<!-- 要想在别的App上能成功调起App,必须添加intent过滤器 --><!-- 如果有多个intent-filter,需要各写各的inte

2021-08-12 16:02:23 241

原创 解决Android冷启动白屏问题、点击应用图标出现延时显示APP

一般情况下,启动页面通常是全屏的,而且会用一张图片来展示用户打开应用程序后第一眼看到的界面。在手机中点击应用程序的图标到应用程序显示完MainActivity的视图这个过程中,通常会用一到两秒的时间。在默认activity的主题下(Light or Black),这两秒屏幕就会出现白屏(Light)或者黑屏(Black)- 实际上是activity默认的主题中的android:windowBackground为白色或者黑色导致的。设置android:windowBackground属性<sty

2021-07-26 16:54:03 1295 1

原创 kotlin基本语法

函数表达式:fun 方法名(参数名1: 数据类型, 参数名2: 数据类型): 返回值数据类型{}普通用法fun test(a: Int): String { return "";}// 将表达式作为函数体,花括号可以省略fun test1(a: Int): Int = 1;// 函数返回无意义的值Unit,返回值可省略fun printSum(a: Int, b: Int) { println("sum of $a and $b is ${a + b}")}

2021-07-15 19:26:12 5612

原创 IOC(控制反转)与DI(依赖注入)

什么是控制反转控制反转(Inversion of Control),一种设计模式,spring框架的核心。目的:降低耦合性。我们传统写代码:类A需要类B的对象,在A里面直接new一个B,然后使用B。A既负责B的创建,又使用B。这样耦合度太高IOC写代码:类A需要类B的对象,即A依赖B,但A不管B的创建过程,只需要拿到B的对象即可。基于这个原则,将B的创建交给一个第三方容器,容器负责创建并维护类实例。某个类需要使用其他类的对象,容器直接将这个类的对象注入到使用的类里。这就叫控制反转和依赖注入。方式1

2021-07-08 17:52:57 81

原创 ASM字节码插桩(AOP思想)

什么是字节码插桩字节码插桩就是在构建的过程中,通过修改已经编译完成的字节码文件,也就是class文件,来实现功能的添加从技术上来说,字节码插桩是 自定义Gradle插件+ASM+Java字节码+切面编程 的综合应用字节码插桩可以做什么举个例子,APP全量统计的时候,经常需要建立很多埋点。这是个很大重复性工作,那么可以通过字节码插桩,在apk打包之前,对class文件需要的地方进行埋点。这样就可以实现无埋点的全量统计。步骤1、自定义Gradle插件作用:将处理java字节码的Transform注

2021-07-08 15:28:24 603

原创 自定义Gradle插件

自定义Gradle插件的方式Gradle是采用Groovy语言,编写Gradle插件主要有三种方法build.gradle脚本中直接使用。这种方式就是直接在Android Studioapp moudle的build.gradle 中进行插件的编写,优点就是不用再上传插件到maven或者其它地方,项目就可以直接使用;缺点也是很明显,就是只能在自己的项目中使用,不能复用,这个不是我们今天要说的。buildSrc中使用。这种方式需要在项目中新建一个model命名为buildSrc,这个目录就用来存

2021-07-08 11:18:24 219 2

原创 Binder机制

2021-07-07 14:25:58 89

原创 View的绘制入口源码分析

在 Activity启动流程 这一篇文章中,我们了解到,Activity 的启动顺序如下:栈顶的Activity的onPause()Instrumentation的newActivity() /创建Activity/待启动Activity的attach()待启动Activity的onCreate()待启动Activity的onResume()ActivityThread.handleResumeActivity() /将DecorView添加到Window/...

2021-07-05 10:39:19 129

原创 Launcher启动流程

Launcher即桌面,是Android智能设备的窗口,用户使用最频繁的软件之一。Launhcer是Android所有应用的入口,也提供窗口小部件等功能当然,Launcher本身就是一个APP,一个提供桌面的APP,我们也可以开发一款Launcher APP作为手机的桌面。Laucher有很多和普通APP不同的地方。Launcher是顶部APP,即任何应用返回后都是到Launcher,不能再继续返回;Launcher是所有应用的入口,可以管理应用;Launcher是Android系统启动后就要显示

2021-07-01 16:37:03 2920 1

原创 Zygote系统进程启动流程

系统源码路径:http://www.androidos.net.cn/sourcecode在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的;因为Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程;也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。大致流程可分为:init进程 –>

2021-06-30 18:04:25 463 4

原创 网络协议与请求

网络七大层标准的OSI参考模型:应用层:HTTP(Pull),XMPP(Push),WebSocket表现层:数据格式化,没有协议。会话层:解除或建立接点的联系,没有协议。传输层:传输控制协议:Socket(TCP,UDP)网络层:为数据包选择路由:IP数据链路层:传输有地址的帧,检测错误。物理层:比特流传输数据。TCP,UDP区别TCP 是面向连接的,UDP 是面向无连接的TCP 是面向字节流的,UDP 是基于数据报的TCP 保证数据正确性,UDP 可能丢包TCP 保证数

2021-04-21 18:10:31 464

原创 模块化、组件化、插件化、热修复、增量更新

模块化主要是重用,使用module,不强调单独编译,通信方式为intent路由,也可以用阿里路由框架。组件化主要是解藕,功能拆分,使用module,debug环境下apply plugin 切换为application,强调单独编译,通信方式为intent路由,也可以用阿里路由框架。模块化与组件化的差别在于颗粒度,模块相对于组件的粒度较大,组件分的更细。一个模块可以由很多个组件构成。插件化不同的业务模块都做成一个apk,点击对应的业务模块就去动态加载对应的apk,可以并行开发,插件化本身是不同进

2021-04-21 10:56:58 173

原创 适配

适配:使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果基本概念屏幕尺寸含义:手机对角线的物理尺寸单位:英寸(inch),1英寸=2.54cm Android手机常见的尺寸有5寸、5.5寸、6寸等等屏幕分辨率含义:手机在横向、纵向上的像素点数总和 1,一般描述成屏幕的"宽x高”=AxB 2,含义:屏幕在横向方向(宽度)上有A个像素点,在纵向方向(高)有B个像素点 3,例子:1080x1920,即宽度方向上有1080个像素点,在高度方向

2021-04-20 15:42:17 1179

原创 View的绘制、View的事件分发与传递

view的绘制流程View 绘制中主要流程分为measure,layout, draw 三个阶段。measure :根据父 view 传递的 MeasureSpec 进行计算大小。layout :根据 measure 子 View 所得到的布局大小和布局参数,将子View放在合适的位置上。draw :把 View 对象绘制到屏幕上。发起绘制的入口那么发起绘制的入口在哪里呢?在介绍发起绘制的入口之前,我们需要先了解Window,ViewRootImpl,DecorView之间的联系。一个

2021-04-19 12:19:14 263

原创 Android四大组件

Activity启动模式Standard:标准模式:开启一个Activity就会产生一个新的实例。SingleTask:单一任务栈模式:如果任务栈中已经有实例,就不会再创建,只能有一个实例。SingleTop:单一栈顶模式:如果任务栈的栈顶有这个实例,才不会再创建允许有多个实例。SingleInstance:单一实例模式:每个Activity有自己的任务栈,栈中有且只有一个实例。生命周期问题:设备横竖屏切换,Activity会发生什么?不设置Activity的android:conf

2021-04-16 15:03:52 170

原创 设计模式。

单例模式整个项目有且只有一个实例懒汉式普通写法public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 1:懒汉式,静态工程方法,创建实例 */ public static Singl

2021-04-14 16:38:33 152

原创 加密算法

非对称加密(不可互逆)MD5非对称加密算法。优点:不可逆,压缩性,不容易修改,容易计算缺点:穷举法可以破解实现String2MD5public static String string2MD5(String text) { try { //获取摘要器 MessageDigest MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //通过摘要器对字符串的二进制字节数

2021-04-14 14:37:58 144

原创 算法

二分查找必须有前提,数组中的元素要有序public static int halfSeach_2(int[] arr, int key) { int min, max, mid; min = 0; max = arr.length - 1; mid = (max + min) >> 1; //(max+min)/2; while (arr[mid] != key) { if (key &g

2021-04-14 14:05:46 98

原创 Android中基于java数据结构的实现

前面我们已经了解了java中的九大数据结构,那么它们在Android中是怎么被实现的呢。CollectionList(可存放重复元素,有序的)ArrayList(基于数组)是最常用的一种数据结构。内部是基于数组实现的。线程不安全。大家应该知道数组是无法扩容的,申明了多大的就是多大的长度。而且数组的插入和删除比较慢,需要将该位置之后的元素集体前移或后移。ArrayList的主要功能就是解决这两个缺点。核心实现原理:扩容会涉及到新建数组、元素复制等假如现有一个ArrayList对象,内部数组

2021-04-13 16:15:36 150

原创 九大数据结构

数据结构数组先看图理解是连续性的内存空间长度是固定的,指定长度之后不可动态扩展由数据域+下标组成增删效率低,需要移动被修改元素之后的所有数据查询效率高,可通过数组名+下标直接访问链表先看图理解是非连续性的内存空间长度是不固定的,可动态扩展由数据域+指针组成,当前节点包含了此节点的数据和指向下一节点地址的指针增删效率高,只需要修改指针的指向查询效率低,只能通过遍历节点依次查询,比较耗时单链表首尾互相指向,就是双链表跳表定义跳表的出现是为了解决

2021-04-10 18:45:05 262

原创 线程、多线程、线程池、进程

线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。同步:在一个线程执行,先执行完了前面的代码,才会执行后面的代码,是阻塞的。异步:开启一个新的线程执行,不会等前面的代码执行完,就会执行后面的代码,是非阻塞的。什麽是main(UI)线程:android启动的第一个线程。主要负责处理ui和事件的工作。特别注意更新ui只能在ui线程进行,不可以在其他线程更新ui,否则会崩溃。在ui线程不可以做耗时

2021-04-09 20:19:03 502 1

原创 Android启动优化+ANR优化

概述应用程序的响应是由ActivityManager和WindowManager系统服务监视的。(Activity实现了Window.Callback和KeyEvent.Callback)体现动画执行不流畅界面卡顿列表滑动卡顿不响应用户事件产生原因UI线程进行耗时操作同一时间动画执行次数过多,CPU或GPU负载过重view的过度绘制,频繁measure,layout频繁GC导致Activity:5秒BroadcastReceiver:10秒Service:20秒以上组

2021-04-09 18:12:47 241

原创 Android内存优化

xxx

2021-04-09 17:00:51 487 1

原创 JNI

概述几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。最初我在学习JNI开发时,基本是懵的。因为大部分JNI开发的指南,其实是在教我们,如何生成.so文件和如何引入.so文件。我们参照着博客的步骤,修改build.gradle,添加cmakelists,写JNI接口,写c++。但每一步,我们实际是在做啥,我们并没有清晰的认识。这也导致每次JNI的配置步骤,看一次忘一次。本文旨在彻底写清楚,当我们在做JN

2021-04-09 15:25:23 1055 1

原创 内存

内存dalvik内存(即java内存)heap(堆内存):线程共享区域存储数据类型成员变量基本数据类型:其变量名及其数据值存放在堆内存中引用数据类型:对象存放在堆内存中,其变量名和地址值存放在栈中,该地址值指向所引用的对象局部变量引用数据类型:对象存放在堆内存中,其变量名和地址值存放在栈中,该地址值指向所引用的对象内存释放GCstack(栈内存):线程私有区域存储数据类型局部变量基本数据类型:其变量名及其数据值存放在栈内存中疑问:局部

2021-04-09 11:52:59 220 2

原创 虚拟机与GC

虚拟机1,jvm加载过程:A.java经过编译器编译,生成A.class字节码文件,多个class文件会被打包成jar文件程序访问A这个类时,会通过ClassLoader类加载器将A.class加载到jvm的内存中2,dalvik+JIT加载过程:A.java经过编译器编译,生成A.class字节码文件dx工具将class文件打包成dex文件JIT(Just In Time Compiler):即时编译策略,即动态编译缺点:每次启动应用都要重新编译(没有缓存

2021-04-09 11:29:48 144

原创 Android知识综合梳理(大篇幅、大范围)

虚拟机jvm加载过程 1,A.java经过编译器编译,生成A.class字节码文件,多个class文件会被打包成jar文件 2,程序访问A这个类时,会通过ClassLoader类加载器将A.class加载到jvm的==内存==中dalvik+JIT加载过程 1,A.java经过编译器编译,生成A.class字节码文件 2,dx工具将class文件打包成dex文件JIT(Just In Time Compiler) 即时编译策略,即动态编译 缺点: 1,每次启动应用都要重新

2021-04-08 11:27:36 4231 15

原创 JavaEE--spring(4)

AOPAOP:全称是 Aspect Oriented Programming 即:面向切面编程。简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。AOP的作用及优势:作用: 在程序运行期间,不修改源码对已有方法进行增强。优势: 减少重复代码 提高开发效AOP的实现方式:使用动态代理技术AOP 相关术语Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的

2021-01-07 18:09:45 113

原创 JavaEE--spring(3)

回顾动态代理动态代理1.特点:字节码随用随创建,随用随加载2.作用:不修改源码的基础上对方法增强3.分类: 基于接口的动态代理 基于子类的动态代理基于接口的动态代理1.涉及的类:Proxy2.提供者:JDK官方3.如何创建代理对象: 使用Proxy类中的newProxyInstance方法4.创建代理对象的要求: 被代理类最少实现一个接口,如果没有则不能使用5.newProxyInstance方法的参数: * ClassLoader:类加载器 它是用于加载代理对象字节码的

2021-01-07 16:00:37 117

原创 JavaEE--spring(2)

spring中的新注解Configuration作用:指定当前类是一个配置类细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。ComponentScan作用:用于通过注解指定spring在创建容器时要扫描的包属性:value它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。我们使用此注解就等同于在xml中配置了:<context:component-scan base-packag

2021-01-07 14:27:21 59

原创 JavaEE--spring(1)

程序的耦合耦合:程序间的依赖关系 包括: 类之间的依赖 方法间的依赖 解耦: 降低程序间的依赖关系 实际开发中: 应该做到:编译期不依赖,运行时才依赖。 解耦的思路: 第一步:使用反射来创建对象,而避免使用new关键字。 第二步:通过读取配置文件来获取要创建的对象全限定类名* 示例: public static void main(String[] args) throws Exception{ // 1.注册驱动 //

2020-12-19 15:53:27 95 2

原创 JavaEE--mybatis(3)

mybatis 延迟加载策略问题:在一对多中,当我们有一个用户,它有100个账户。 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。 在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。什么是延迟加载 在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)什么是立即加载 不管用不用,只要一调用方法,马上发起查询

2020-12-18 18:09:34 120 1

原创 JavaEE--mybatis(2)

mybatis连接池mybatis连接池提供了3种方式的配置: 配置的位置: 主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。 type属性的取值: * POOLED 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现 * UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。 * JNDI 采用服务器提供

2020-12-18 14:16:53 132

原创 Socket bind failed: [730048]异常的处理

问题将项目运行在tomcat上时,出现Socket bind failed: [730048]异常原因1.Tomcat的运行端口被其他程序占用了2.启动了多个tomcat解决对于原因1的解决: * 方法1:修改tomcat端口号:打开tomcat/conf/server.xml文件,将 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"

2020-12-15 14:28:52 2319

原创 idea中 Application Server not specified

问题idea中的tomcat报错: Application Server not specified原因没有关联本地的tomcat,关联本地tomcat即可解决点击idea中的edit configurations进行关联

2020-12-15 14:13:55 2243

原创 JavaEE--mybatis(1)

1、什么是框架?它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。2、三层架构表现层: 是用于展示数据的业务层: 是处理业务需求持久层: 是和数据库交互的3、持久层技术解决方案 JDBC技术: Connection PreparedStatement ResultSet Spring的JdbcTemplate: Spring中对jdbc的简单封装 A

2020-12-14 16:13:59 194

空空如也

空空如也

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

TA关注的人

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