![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android
文章平均质量分 77
Android基础
FloriztW
这个作者很懒,什么都没留下…
展开
-
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 · 844 阅读 · 4 评论 -
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 · 145 阅读 · 0 评论 -
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 · 1101 阅读 · 0 评论 -
安卓基础使用案例
从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 · 256 阅读 · 0 评论 -
解决Android冷启动白屏问题、点击应用图标出现延时显示APP
一般情况下,启动页面通常是全屏的,而且会用一张图片来展示用户打开应用程序后第一眼看到的界面。在手机中点击应用程序的图标到应用程序显示完MainActivity的视图这个过程中,通常会用一到两秒的时间。在默认activity的主题下(Light or Black),这两秒屏幕就会出现白屏(Light)或者黑屏(Black)- 实际上是activity默认的主题中的android:windowBackground为白色或者黑色导致的。设置android:windowBackground属性<sty原创 2021-07-26 16:54:03 · 1347 阅读 · 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 · 467 阅读 · 4 评论 -
Launcher启动流程
Launcher即桌面,是Android智能设备的窗口,用户使用最频繁的软件之一。Launhcer是Android所有应用的入口,也提供窗口小部件等功能当然,Launcher本身就是一个APP,一个提供桌面的APP,我们也可以开发一款Launcher APP作为手机的桌面。Laucher有很多和普通APP不同的地方。Launcher是顶部APP,即任何应用返回后都是到Launcher,不能再继续返回;Launcher是所有应用的入口,可以管理应用;Launcher是Android系统启动后就要显示原创 2021-07-01 16:37:03 · 2958 阅读 · 1 评论 -
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 阅读 · 0 评论 -
自定义Gradle插件
自定义Gradle插件的方式Gradle是采用Groovy语言,编写Gradle插件主要有三种方法build.gradle脚本中直接使用。这种方式就是直接在Android Studioapp moudle的build.gradle 中进行插件的编写,优点就是不用再上传插件到maven或者其它地方,项目就可以直接使用;缺点也是很明显,就是只能在自己的项目中使用,不能复用,这个不是我们今天要说的。buildSrc中使用。这种方式需要在项目中新建一个model命名为buildSrc,这个目录就用来存原创 2021-07-08 11:18:24 · 227 阅读 · 2 评论 -
Binder机制
原创 2021-07-07 14:25:58 · 96 阅读 · 0 评论 -
ASM字节码插桩(AOP思想)
什么是字节码插桩字节码插桩就是在构建的过程中,通过修改已经编译完成的字节码文件,也就是class文件,来实现功能的添加从技术上来说,字节码插桩是 自定义Gradle插件+ASM+Java字节码+切面编程 的综合应用字节码插桩可以做什么举个例子,APP全量统计的时候,经常需要建立很多埋点。这是个很大重复性工作,那么可以通过字节码插桩,在apk打包之前,对class文件需要的地方进行埋点。这样就可以实现无埋点的全量统计。步骤1、自定义Gradle插件作用:将处理java字节码的Transform注原创 2021-07-08 15:28:24 · 626 阅读 · 0 评论 -
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 · 82 阅读 · 0 评论 -
虚拟机与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 · 148 阅读 · 0 评论 -
内存
内存dalvik内存(即java内存)heap(堆内存):线程共享区域存储数据类型成员变量基本数据类型:其变量名及其数据值存放在堆内存中引用数据类型:对象存放在堆内存中,其变量名和地址值存放在栈中,该地址值指向所引用的对象局部变量引用数据类型:对象存放在堆内存中,其变量名和地址值存放在栈中,该地址值指向所引用的对象内存释放GCstack(栈内存):线程私有区域存储数据类型局部变量基本数据类型:其变量名及其数据值存放在栈内存中疑问:局部原创 2021-04-09 11:52:59 · 285 阅读 · 2 评论 -
JNI
概述几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。最初我在学习JNI开发时,基本是懵的。因为大部分JNI开发的指南,其实是在教我们,如何生成.so文件和如何引入.so文件。我们参照着博客的步骤,修改build.gradle,添加cmakelists,写JNI接口,写c++。但每一步,我们实际是在做啥,我们并没有清晰的认识。这也导致每次JNI的配置步骤,看一次忘一次。本文旨在彻底写清楚,当我们在做JN原创 2021-04-09 15:25:23 · 1064 阅读 · 1 评论 -
线程、多线程、线程池、进程
线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。同步:在一个线程执行,先执行完了前面的代码,才会执行后面的代码,是阻塞的。异步:开启一个新的线程执行,不会等前面的代码执行完,就会执行后面的代码,是非阻塞的。什麽是main(UI)线程:android启动的第一个线程。主要负责处理ui和事件的工作。特别注意更新ui只能在ui线程进行,不可以在其他线程更新ui,否则会崩溃。在ui线程不可以做耗时原创 2021-04-09 20:19:03 · 518 阅读 · 1 评论 -
Android内存优化
xxx原创 2021-04-09 17:00:51 · 494 阅读 · 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 · 244 阅读 · 0 评论 -
九大数据结构
数据结构数组先看图理解是连续性的内存空间长度是固定的,指定长度之后不可动态扩展由数据域+下标组成增删效率低,需要移动被修改元素之后的所有数据查询效率高,可通过数组名+下标直接访问链表先看图理解是非连续性的内存空间长度是不固定的,可动态扩展由数据域+指针组成,当前节点包含了此节点的数据和指向下一节点地址的指针增删效率高,只需要修改指针的指向查询效率低,只能通过遍历节点依次查询,比较耗时单链表首尾互相指向,就是双链表跳表定义跳表的出现是为了解决原创 2021-04-10 18:45:05 · 265 阅读 · 0 评论 -
Android中基于java数据结构的实现
前面我们已经了解了java中的九大数据结构,那么它们在Android中是怎么被实现的呢。CollectionList(可存放重复元素,有序的)ArrayList(基于数组)是最常用的一种数据结构。内部是基于数组实现的。线程不安全。大家应该知道数组是无法扩容的,申明了多大的就是多大的长度。而且数组的插入和删除比较慢,需要将该位置之后的元素集体前移或后移。ArrayList的主要功能就是解决这两个缺点。核心实现原理:扩容会涉及到新建数组、元素复制等假如现有一个ArrayList对象,内部数组原创 2021-04-13 16:15:36 · 157 阅读 · 0 评论 -
算法
二分查找必须有前提,数组中的元素要有序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 · 100 阅读 · 0 评论 -
加密算法
非对称加密(不可互逆)MD5非对称加密算法。优点:不可逆,压缩性,不容易修改,容易计算缺点:穷举法可以破解实现String2MD5public static String string2MD5(String text) { try { //获取摘要器 MessageDigest MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //通过摘要器对字符串的二进制字节数原创 2021-04-14 14:37:58 · 148 阅读 · 0 评论 -
设计模式。
单例模式整个项目有且只有一个实例懒汉式普通写法public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 1:懒汉式,静态工程方法,创建实例 */ public static Singl原创 2021-04-14 16:38:33 · 155 阅读 · 0 评论 -
Android四大组件
Activity启动模式Standard:标准模式:开启一个Activity就会产生一个新的实例。SingleTask:单一任务栈模式:如果任务栈中已经有实例,就不会再创建,只能有一个实例。SingleTop:单一栈顶模式:如果任务栈的栈顶有这个实例,才不会再创建允许有多个实例。SingleInstance:单一实例模式:每个Activity有自己的任务栈,栈中有且只有一个实例。生命周期问题:设备横竖屏切换,Activity会发生什么?不设置Activity的android:conf原创 2021-04-16 15:03:52 · 176 阅读 · 0 评论 -
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 · 271 阅读 · 0 评论 -
适配
适配:使得某一元素在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 · 1208 阅读 · 0 评论 -
模块化、组件化、插件化、热修复、增量更新
模块化主要是重用,使用module,不强调单独编译,通信方式为intent路由,也可以用阿里路由框架。组件化主要是解藕,功能拆分,使用module,debug环境下apply plugin 切换为application,强调单独编译,通信方式为intent路由,也可以用阿里路由框架。模块化与组件化的差别在于颗粒度,模块相对于组件的粒度较大,组件分的更细。一个模块可以由很多个组件构成。插件化不同的业务模块都做成一个apk,点击对应的业务模块就去动态加载对应的apk,可以并行开发,插件化本身是不同进原创 2021-04-21 10:56:58 · 181 阅读 · 0 评论 -
网络协议与请求
网络七大层标准的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 · 475 阅读 · 0 评论 -
高德地图poi详情卡片上滑效果
BottomSheets是一个底部可操作的布局,可以做菜单,对话框。最近项目中需要做一个类似高德地图poi详情卡片上拉并且配合图片滑出的效果,所以简单的做个总结,碰到的问题也记一下。效果请看下图:其他的就不多说了,show my code:布局:<?xml version="1.0" encoding="utf-8"?><android.support.design.w......原创 2019-04-15 10:52:08 · 1152 阅读 · 0 评论 -
全网最好看的自定义渐变二维码
老规矩,先上效果图:说到二维码,对于开发人员来说那这张图片就在熟悉不过了什么?不熟悉?那好吧,我来讲一下吧…(了解二维码原理的大佬请略过…)基础知识首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(......原创 2019-04-16 11:24:38 · 956 阅读 · 0 评论 -
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 · 4234 阅读 · 15 评论