![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
渣本Android学习笔记
文章平均质量分 82
渣本工作前Android学习过程记录
打架不行的二哈
点点关注,点个赞,会让作者元气满满的哦
展开
-
Android 监听系统截屏操作
在Android App中监听系统截屏功能,没有系统标准的监听器或者api可以调用,需要自己实现。针对这个需求,目前大部分实现方案是监听系统的媒体数据库。原创 2023-01-29 14:57:51 · 1743 阅读 · 3 评论 -
Protobuf协议
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。1、ProtoBuf协议说明proto文件原创 2022-03-07 19:39:02 · 2013 阅读 · 1 评论 -
SharedPreferences使用及原理
一、SharedPreferences介绍SharedPreferences 类提供了一个通用框架,以便您能够保存和检索原始数据类型的永久性键值对。您可以使用 SharedPreferences 来保存任何原始数据:布尔值,浮点值,整型值,长整型和字符串。此数据将跨多个用户会话永久保留(即使您的应用已终止亦如此)。SharedPreferences 使用 xml 格式为 Android 应用提供一种永久数据存贮方式,并且使用键值对的方式来存储数据的。相对于一个 Android 应用而言,目录 / dat原创 2022-03-07 19:35:13 · 10895 阅读 · 0 评论 -
Android代码混淆
混淆简介代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。混淆的好处令 APK 难以被逆向工程,即很大程度上增加反编译的成本;在打包时移除无用资源,显著减少 APK 体积;对字节码进行优化,移除无用指令,应用运行更快;以变通方式避免 Android 中常见的 64k 方法数引用的限制。Android 当中的混淆在 Android 中,我们平常所说的"混淆"其实有两层意思,一个是 Java 代码的混淆,另外一个是资源的压缩。其实这两者原创 2021-11-22 15:41:28 · 2239 阅读 · 0 评论 -
Android View绘制13问13答
1.View的绘制流程分几步,从哪开始?哪个过程结束以后能看到view?从ViewRoot的performTraversals开始,经过measure,layout,draw 三个流程。draw流程结束以后就可以在屏幕上看到view了。2.view的测量宽高和实际宽高有区别吗?基本上百分之99的情况下都是可以认为没有区别的。有两种情况,有区别。第一种 就是有的时候会因为某些原因 view会多次测量,那第一次测量的宽高 肯定和最后实际的宽高 是不一定相等的,但是在这种情况下最后一次测量的宽高和实际宽高转载 2021-11-17 15:28:39 · 216 阅读 · 0 评论 -
Fragment相关面试题
1、在fragment中为什么有时getActivity()会为null?Fragment 的 getActivity() 会在 onDetach 之后释放持有的 Activity,因而返回了 null。2、Fragment为什么有的时候会重叠,怎么产生的,又如何解决?一般满足下面2个条件才可能会发生重叠:发生了页面重启(旋转屏幕、内存不足等情况被强杀重启);系统在页面重启前,帮我们保存了Fragment的状态,但是在重启后恢复时,视图的可见状态没帮我们保存,而Fragment默认的是sho原创 2021-11-17 14:37:51 · 896 阅读 · 0 评论 -
Android MMKV使用及原理分析
什么是MMKVMMKV——基于 mmap 的高性能通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。近期已移植到 Android 平台。在腾讯内部开源半年之后,得到公司内部团队的广泛应用和一致好评。通过 mmap原创 2021-11-12 17:02:24 · 1245 阅读 · 0 评论 -
Handler同步屏障机制
前言同步屏障机制是一套为了让某些特殊的消息得以更快被执行的机制。这里我们假设一个场景:我们向主线程发送了一个UI绘制操作Message,而此时消息队列中的消息非常多,那么这个Message的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障机制的作用,是让这个绘制消息得以越过其他的消息,优先被执行。MessageQueue中的Message,有一个变量isAsynchronous,他标志了这个Message是否是异步消息;标记为true称为异步消息,标记为false称为同步消息。同时还有另一个变量t转载 2021-11-11 14:43:10 · 339 阅读 · 0 评论 -
Binder相关面试题
1、Android中进程和线程的关系,区别进程可以认为是程序执行时的一个实例。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。一个进程无法直接访问另一个进程的变量和数据结构, 如果希望让一个进程访问另一个进程的资源,需要使用进程间通信,比如:管道,文件, 套接字等。一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。 线程与进程的一个主要区别是,同一进程内的多个线程会共享部分状态, 多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时, 每个线程还拥有自己的寄存原创 2021-11-10 16:40:15 · 3138 阅读 · 8 评论 -
WebView相关面试题
1、如何提高WebView加载速度美团技术分享WebView启动过程大概分为以下几个阶段:App中打开WebView的第一步并不是建立连接,而是启动浏览器内核。优化手段围绕着以下两个点进行:预加载WebView。加载WebView的同时,请求H5页面数据。常见的方法是全局WebView,在客户端刚启动时,就初始化一个全局的WebView待用,并隐藏;这种方法可以比较有效的减少WebView在App中的首次打开时间。当用户访问页面时,不需要初始化WebView的时间。当然这也带来原创 2021-11-09 17:38:31 · 2774 阅读 · 0 评论 -
Android常用开源组件探索-OkHttp(2)原理详解
1、概述OkHttp 是 Square 公司开源的一款网络框架,一般和 Retrofit、RxJava 或协程一起使用。OkHttp 支持发起同步请求和异步请求,同步请求对应类的是 RealCall ,异步请求对应的是 AsyncCall ,AsynCall 是 RealCall 的内部类。RealCall 和 AsyncCall 可以理解为同步请求操作和异步请求操作。当用 RealCall 的 execute() 方法发起同步请求时,请求会被请求分发器 Dispatcher 放到同步请求操作队列中,原创 2021-10-26 15:38:07 · 1513 阅读 · 0 评论 -
App三种启动场景:冷启动、热启动、温启动
1、冷启动(App进程创建)系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP此时,APP的启动将经历两个阶段:第一阶段:加载并启动app;app启动后,第一时间为app显示一个空白的window;创建app进程第二阶段:系统一旦创建了app进程,app进程就要负责做以下的任务:创建app对象;启动主进程ActivityThread;创建MainActivity;渲染视图;执行onLayout;执行onDraw完成第一次绘制后,把mainActivity原创 2021-10-13 19:41:52 · 3503 阅读 · 0 评论 -
Service的启动过程(源码分析)
基于Android11要启动Service,我们会调用startService方法,它的实现在ContextWrapper中,代码如下所示:frameworks/base/core/java/android/content/ContextWrapper.javapublic class ContextWrapper extends Context { Context mBase;... @Override public ComponentName startService(I.原创 2021-10-12 17:57:37 · 249 阅读 · 0 评论 -
Android应用程序启动过程(源码分析)
本文相关源代码基于Android11Launcher启动后会将已安装应用程序的快捷图标显示到界面上,当我们点击应用程序的快捷图标时就会调用Launcher的startActivitySafely方法,如下所示:packages/apps/Launcher3/src/com/android/launcher3/Launcher.java@Override1881 public boolean startActivitySafely(View v, Intent intent, ItemI.原创 2021-10-11 19:10:41 · 317 阅读 · 0 评论 -
targetSdkVersion、compileSdkVersion、minSdkVersion作用与区别
minSdkVersion:指定app运行的最低设备sdk版本,如minSdkVersion=19 表示该app最低支持Android 4.4(API 19)设备,低于此版本的设备将不能使用该app。随着Android系统版本的持续更新,之前旧的系统版本占有率越来越低,我们可以根据需要将minSdkVersion值往后调整。compileSdkVersion:和编译时有关。比如我们当前compileSdkVersion=28(Andorid 9.0),Android 10 新增了有关5G的api。我们原创 2021-10-09 14:05:34 · 524 阅读 · 0 评论 -
AMS相关面试题
1、ActivityManagerService是什么?什么时候初始化的?有什么作用?ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。(系统启动流程)如果打开一个App的话,需要AMS去通知zygote进程, 所有的Acti原创 2021-10-08 19:26:28 · 1547 阅读 · 0 评论 -
Activity与Service的启动流程
1、Activity的启动流程Activity跨进程启动启动流程:点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;system_server进程接收到请求后,向zygote进程发送创建进程的请求;Zygote进程fork出新的子进程,即App进程;App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;system_server进程在收到请求后,进行一系原创 2021-10-08 17:06:58 · 346 阅读 · 0 评论 -
Android权限相关知识
从android 6.0(API 级别 23)开始,android引入了运行时权限,用户开始在应用运行时向其授予权限,而不是在应用安装时向其授予权限,如果应用的某项功能需要使用到受运行时权限保护的资源(例如相机、位置、麦克风等),但在运行该功能前没有动态地申请相应的权限,那么在调用该功能时就会抛出SecurityException异常, android 6.0已经推出了很多年了,相信大家对于运行时权限的申请过程已经非常的熟悉,但是android的运行时权限的申请过程一直都是非常的繁琐的,主要有两步:1、在原创 2021-10-08 11:54:57 · 365 阅读 · 0 评论 -
Android工程:模块化、组件化、插件化
移动开发诞生,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,二话不说,直接就开始写起,是不是这样呢?new Project -> 分包 -> 写起。我相信都经历过,也写的比较爽,为什么呢?这种模式不涉及乱七八糟的处理方式, 上手快,开发快,足够敏捷。那么原因是什么呢?Mobile Project 刚起步,项目都偏小,一些附加业务还没绑到App上。1、模块化Android Studio出来了,多出来了一个新的概念, Project, Module… 模块;当时以包的形式分离的公转载 2021-09-26 11:11:01 · 596 阅读 · 0 评论 -
AOP---面向切向编程
1、AOP即面向切向编程AOP 是 Aspect Oriented Programming 的缩写,译为面向切向编程。用我们最常用的 OOP 来对比理解:纵向关系 OOP,横向角度 AOP举个小例子:设计一个日志打印模块。按 OOP 思想,我们会设计一个打印日志 LogUtils 类,然后在需要打印的地方引用即可。public class ClassA { private void initView() { LogUtils.d(TAG, "onInitView");原创 2021-09-13 19:42:34 · 159 阅读 · 0 评论 -
Android相关面试题
1、Activity的startActivity和Context的startActivity区别?从Activity中启动新的Activity时可以直接mContext.startActivity(intent)就好如果从其他Context中启动Activity则必须给intent设置Flag:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ; mContext.startActivity(intent);2、Android为什么引入Parcel原创 2021-09-13 15:26:28 · 126 阅读 · 0 评论 -
Android WebView常见的安全漏洞和解决方案
概述WebView中安全漏洞有三种,分别是:远程代码执行漏洞密码明文存储漏洞域控制不严格漏洞下面依次分析各漏洞产生的原因以及解决方案1、远程代码执行漏洞1.1 WbView中addJavascriptInterface()接口产生原因:Android API level 17以及之前的系统版本,由于程序没有正确限制使用addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法。通过addJavascri原创 2021-09-10 15:13:04 · 2759 阅读 · 0 评论 -
Jetpack组件---LiveData
1、LiveData介绍1.1 作用LiveData是Jetpack AAC的重要组件,同时也有一个同名抽象类。LiveData,原意是 活着的数据。 数据还能有生命? 先来看下官方的定义:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如Activity/Fragment)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。拆解开来:LiveData是一个数据持有原创 2021-09-09 14:31:19 · 192 阅读 · 0 评论 -
Jetpack组件---Lifecycle
1、什么是LifecycleLifecycle,顾名思义,是用于帮助开发者管理Activity和Fragment 的生命周期,它是LiveData和ViewModel的基础。1.1 为什么引入Lifecycle我们在处理Activity或者Fragment组件的生命周期相关时,不可避免会遇到这样的问题:我们在Activity的onCreate()中初始化某些成员(比如MVP架构中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中对这些成员进行对应处理原创 2021-09-08 17:40:16 · 199 阅读 · 0 评论 -
Jetpack组件---ViewModel
1.什么是ViewModel对于Android传统的代码编写方式,一般地,将页面UI的处理,数据的加载,全部放在Activity或Fragment中进行,但这并不满足“单一功能原则”,也不易于维护和扩展。我们应该将项目结构进行分层,传统的MVC,MVP和MVVM,都是将项目结构分了三层,“各管一摊”,这三种模式各有特点、各有利弊,但它们都有一个共同点,就是区分出了M层与V层,M即Model层,V即View层,M层负责数据的处理,View层负责UI的展示,不同的地方在于如何将M层与V层进行结合。其中,MV原创 2021-09-08 17:05:08 · 142 阅读 · 0 评论 -
RecyclerView缓存机制
1、 ViewHolder1.1 作用ViewHolder是对RecyclerView上的ItemView的封装,它是RecyclerView缓存的载体。它封装了以下属性:View itemView:对应RecyclerView的子Viewint mPosition:View当前对应数据在数据源中的位置int mOldPosition:View上次绑定的数据在数据源中的位置long mItemId:可以判断ViewHolder是否需要重新绑定数据int mItemViewType:itemV原创 2021-08-31 11:06:18 · 2682 阅读 · 0 评论 -
ListView优化方案及其原理
1、重用ConvertViewListView的View回收机制:在可视范围上面或者下面的View加入到回收池中。当在可视范围内的View被移出可视范围内时,其也会被添加到回收池中。以这种方式ListView只需占用非常少的内存,可以存储可视范围内的View和回收池中的View。参数convertView实际上就是一个可回收的View。当ListView要回收这个View的时候,它的数据就会被清空。因此,当convertView不为null的时候,只需要将数据填充到里面,而不用Inflate一个新的Vi转载 2021-08-30 15:11:19 · 1099 阅读 · 1 评论 -
Android常见内存泄漏
1、非静态内部类默认持有外部类的引用会导致内存泄漏静态内部类与非静态内部类之间存在一个最大的区别,就是非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。 代码:public class Outer { private void outerDo() {} class Inter { private void innerDo() { // 内部类可以直接访问外部类成转载 2021-08-04 19:48:03 · 551 阅读 · 0 评论 -
Bitmap相关面试题
1、Bitmap 内存占用的计算占用的内存 = width * height * nTargetDensity/inDensity * nTargetDensity/inDensity * 一个像素所占的内存。ARGB_8888: 每个像素4字节. 共32位,默认设置。Alpha_8: 只保存透明度,共8位,1字节。ARGB_4444: 共16位,2字节。RGB_565:共16位,2字节,只存储RGB值。2、getByteCount() & getAllocationByteCo原创 2021-08-03 10:22:05 · 627 阅读 · 0 评论 -
View事件分发相关面试题
1、View事件分发机制对屏幕的点击,滑动,抬起等一系的动作都是由一个一个MotionEvent对象组成的。根据不同动作,主要有以下三种事件类型:ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件ACTION_MOVE:手指在屏幕上移动时候产生该事件ACTION_UP:手指从屏幕上松开的瞬间产生该事件从ACTION_DOWN开始到ACTION_UP结束我们称为一个事件序列。正常情况下,无论你手指在屏幕上有多么骚的操作,最终呈现在MotionEvent上来讲无外乎下面两种:原创 2021-07-30 15:36:15 · 1728 阅读 · 0 评论 -
Bitmap相关知识点
Bitmap 应该是很多应用中最占据内存空间的一类资源了,Bitmap 也是导致应用 OOM 的常见原因之一。例如,Pixel 手机的相机拍摄的照片最大可达 4048 * 3036 像素(1200 万像素),如果使用的位图配置为 ARGB_8888(Android 2.3 及更高版本的默认设置),将单张照片加载到内存大约需要 48MB 内存(4048 * 3036 * 4 字节),如此庞大的内存需求可能会立即耗尽应用的所有可用内存。全文可以概括为以下几个问题:Bitmap 所占内存大小的计算公式?B原创 2021-04-26 11:27:28 · 370 阅读 · 0 评论 -
Android多线程2:IntentService
1.IntentService概述IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类,因此必须创建它的子类才能使用IntentService。客户端startService发送请求,IntentService就被启动,然后会在一个工作线程中处理传递过来的Intent,当任务结束后就会自动停止服务。IntentService是自己维护了一个线程,来执行耗时的操作,然后里面封装了HandlerThread,能够方便在子线程创建Handler。2.Inten原创 2021-03-11 20:15:34 · 245 阅读 · 0 评论 -
Android多线程通信1:HandlerThread
1.HandlerThread特点及注意事项HandlerThread本质上是一个线程类,继承自Thread。在线程内部,代码是串行处理的。其内部拥有自己的Looper对象,也就是说它可以自己进行消息的循环。通过getLooper()方法可以将这个Looper对象传递给Handler对象,这样就可以在handleMessage()方法中执行异步任务。HandlerThread将looper对象传递给子线程进行处理,目的是为了分担MainLooper的工作量,降低了主线程的压力,使界面更加流畅。开启一原创 2021-03-11 19:23:37 · 195 阅读 · 0 评论 -
Android studio项目目录结构
Android studio项目目录结构一、gradle目录二、idea目录三、moudle(App)目录1、build目录2、libs目录3、src目录(1)AndroidTest(2)Java(3) resA、资源介绍图片资源布局资源values目录raw目录动画资源B、如何使用资源(4)AndroidManifest.xml(5)test新建一个工程项目 Project视图下的目录结构如下图所示:目录文件作用.gradlegradle项目产生文件夹(自动编译工具产生的文件)原创 2020-07-09 09:44:30 · 4204 阅读 · 0 评论