自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (1)
  • 收藏
  • 关注

原创 Android 监听系统截屏操作

在Android App中监听系统截屏功能,没有系统标准的监听器或者api可以调用,需要自己实现。针对这个需求,目前大部分实现方案是监听系统的媒体数据库。

2023-01-29 14:57:51 1648 3

原创 Protobuf协议

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。1、ProtoBuf协议说明proto文件

2022-03-07 19:39:02 1991 1

原创 SharedPreferences使用及原理

一、SharedPreferences介绍SharedPreferences 类提供了一个通用框架,以便您能够保存和检索原始数据类型的永久性键值对。您可以使用 SharedPreferences 来保存任何原始数据:布尔值,浮点值,整型值,长整型和字符串。此数据将跨多个用户会话永久保留(即使您的应用已终止亦如此)。SharedPreferences 使用 xml 格式为 Android 应用提供一种永久数据存贮方式,并且使用键值对的方式来存储数据的。相对于一个 Android 应用而言,目录 / dat

2022-03-07 19:35:13 10758

原创 View的生命周期

View简单介绍This class represents the basic building block for user interface components. A Viewoccupies a rectangular area on the screen and is responsible for drawing and event handling.View是屏幕上的一块矩形区域,负责界面的绘制与触摸事件的处理,它是一种界面层控件的抽象,所有的控件都继承自View。View是And

2021-12-08 15:50:39 3124 1

原创 Android代码混淆

混淆简介代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。混淆的好处令 APK 难以被逆向工程,即很大程度上增加反编译的成本;在打包时移除无用资源,显著减少 APK 体积;对字节码进行优化,移除无用指令,应用运行更快;以变通方式避免 Android 中常见的 64k 方法数引用的限制。Android 当中的混淆在 Android 中,我们平常所说的"混淆"其实有两层意思,一个是 Java 代码的混淆,另外一个是资源的压缩。其实这两者

2021-11-22 15:41:28 2224

转载 Android View绘制13问13答

1.View的绘制流程分几步,从哪开始?哪个过程结束以后能看到view?从ViewRoot的performTraversals开始,经过measure,layout,draw 三个流程。draw流程结束以后就可以在屏幕上看到view了。2.view的测量宽高和实际宽高有区别吗?基本上百分之99的情况下都是可以认为没有区别的。有两种情况,有区别。第一种 就是有的时候会因为某些原因 view会多次测量,那第一次测量的宽高 肯定和最后实际的宽高 是不一定相等的,但是在这种情况下最后一次测量的宽高和实际宽高

2021-11-17 15:28:39 204

原创 Fragment相关面试题

1、在fragment中为什么有时getActivity()会为null?Fragment 的 getActivity() 会在 onDetach 之后释放持有的 Activity,因而返回了 null。2、Fragment为什么有的时候会重叠,怎么产生的,又如何解决?一般满足下面2个条件才可能会发生重叠:发生了页面重启(旋转屏幕、内存不足等情况被强杀重启);系统在页面重启前,帮我们保存了Fragment的状态,但是在重启后恢复时,视图的可见状态没帮我们保存,而Fragment默认的是sho

2021-11-17 14:37:51 834

原创 Android MMKV使用及原理分析

什么是MMKVMMKV——基于 mmap 的高性能通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。近期已移植到 Android 平台。在腾讯内部开源半年之后,得到公司内部团队的广泛应用和一致好评。通过 mmap

2021-11-12 17:02:24 1147

转载 Handler同步屏障机制

前言同步屏障机制是一套为了让某些特殊的消息得以更快被执行的机制。这里我们假设一个场景:我们向主线程发送了一个UI绘制操作Message,而此时消息队列中的消息非常多,那么这个Message的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障机制的作用,是让这个绘制消息得以越过其他的消息,优先被执行。MessageQueue中的Message,有一个变量isAsynchronous,他标志了这个Message是否是异步消息;标记为true称为异步消息,标记为false称为同步消息。同时还有另一个变量t

2021-11-11 14:43:10 316

原创 Binder相关面试题

1、Android中进程和线程的关系,区别进程可以认为是程序执行时的一个实例。进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。一个进程无法直接访问另一个进程的变量和数据结构, 如果希望让一个进程访问另一个进程的资源,需要使用进程间通信,比如:管道,文件, 套接字等。一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。 线程与进程的一个主要区别是,同一进程内的多个线程会共享部分状态, 多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时, 每个线程还拥有自己的寄存

2021-11-10 16:40:15 3081 8

原创 WebView相关面试题

1、如何提高WebView加载速度美团技术分享WebView启动过程大概分为以下几个阶段:App中打开WebView的第一步并不是建立连接,而是启动浏览器内核。优化手段围绕着以下两个点进行:预加载WebView。加载WebView的同时,请求H5页面数据。常见的方法是全局WebView,在客户端刚启动时,就初始化一个全局的WebView待用,并隐藏;这种方法可以比较有效的减少WebView在App中的首次打开时间。当用户访问页面时,不需要初始化WebView的时间。当然这也带来

2021-11-09 17:38:31 2721

原创 Android常用开源组件探索-OkHttp(2)原理详解

1、概述OkHttp 是 Square 公司开源的一款网络框架,一般和 Retrofit、RxJava 或协程一起使用。OkHttp 支持发起同步请求和异步请求,同步请求对应类的是 RealCall ,异步请求对应的是 AsyncCall ,AsynCall 是 RealCall 的内部类。RealCall 和 AsyncCall 可以理解为同步请求操作和异步请求操作。当用 RealCall 的 execute() 方法发起同步请求时,请求会被请求分发器 Dispatcher 放到同步请求操作队列中,

2021-10-26 15:38:07 1480

原创 Java动态代理

1、概述1.1 什么是代理我们都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品。关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”。我们把微商代理和厂家进一步抽象,前者可抽象为代理类,后者可抽象为委托类(被代理类)。通过使用代理,通常有两个优点,并且能够分别与我们提到的微商代理的两个特点对应起来:优点一:可以隐藏委托类的实现;

2021-10-25 17:18:13 105

原创 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 3233

原创 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 240

原创 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 311

原创 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 491

原创 Java类加载基础

我们知道,我们从写java代码开始,到代码执行的时候,中间一共经历四个阶段:新建.java文件 并写代码,这称为编辑期。将.java文件编译为.class文件,这称为编译期。将.class文件加载到内存 并 生成.class类,这称为加载期。通过.class类去创建对象、执行代码,这称为运行期。其中,除了第一个阶段我们能直接干预,剩余三个阶段,都是jvm自己执行的(当然也有黑科技可以人工干预)。1、类加载时机引起类加载的场景使用new创建对象时读取或设置类的静态变量时(编译期常量除外

2021-10-09 10:52:52 113

原创 AMS相关面试题

1、ActivityManagerService是什么?什么时候初始化的?有什么作用?ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService。(系统启动流程)如果打开一个App的话,需要AMS去通知zygote进程, 所有的Acti

2021-10-08 19:26:28 1485

原创 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 334

原创 Android权限相关知识

从android 6.0(API 级别 23)开始,android引入了运行时权限,用户开始在应用运行时向其授予权限,而不是在应用安装时向其授予权限,如果应用的某项功能需要使用到受运行时权限保护的资源(例如相机、位置、麦克风等),但在运行该功能前没有动态地申请相应的权限,那么在调用该功能时就会抛出SecurityException异常, android 6.0已经推出了很多年了,相信大家对于运行时权限的申请过程已经非常的熟悉,但是android的运行时权限的申请过程一直都是非常的繁琐的,主要有两步:1、在

2021-10-08 11:54:57 336

转载 Android工程:模块化、组件化、插件化

移动开发诞生,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,二话不说,直接就开始写起,是不是这样呢?new Project -> 分包 -> 写起。我相信都经历过,也写的比较爽,为什么呢?这种模式不涉及乱七八糟的处理方式, 上手快,开发快,足够敏捷。那么原因是什么呢?Mobile Project 刚起步,项目都偏小,一些附加业务还没绑到App上。1、模块化Android Studio出来了,多出来了一个新的概念, Project, Module… 模块;当时以包的形式分离的公

2021-09-26 11:11:01 587

原创 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 152

原创 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 115

原创 Android WebView常见的安全漏洞和解决方案

概述WebView中安全漏洞有三种,分别是:远程代码执行漏洞密码明文存储漏洞域控制不严格漏洞下面依次分析各漏洞产生的原因以及解决方案1、远程代码执行漏洞1.1 WbView中addJavascriptInterface()接口产生原因:Android API level 17以及之前的系统版本,由于程序没有正确限制使用addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法。通过addJavascri

2021-09-10 15:13:04 2532

原创 Java双亲委派机制

1、什么是双亲委派?虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢?这就不得不提到"双亲委派机制"。首先,我们需要知道的是,Java语言系统中支持以下4种类加载器:Bootstrap ClassLoader 启动类加载器Extention ClassLoader 标准扩展类加载器Application ClassLoader 应用类加载器User ClassLoader 用户自定义类加

2021-09-09 15:39:53 572

原创 Jetpack组件---LiveData

1、LiveData介绍1.1 作用LiveData是Jetpack AAC的重要组件,同时也有一个同名抽象类。LiveData,原意是 活着的数据。 数据还能有生命? 先来看下官方的定义:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如Activity/Fragment)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。拆解开来:LiveData是一个数据持有

2021-09-09 14:31:19 183

原创 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 177

原创 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 131

原创 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 2648

转载 ListView优化方案及其原理

1、重用ConvertViewListView的View回收机制:在可视范围上面或者下面的View加入到回收池中。当在可视范围内的View被移出可视范围内时,其也会被添加到回收池中。以这种方式ListView只需占用非常少的内存,可以存储可视范围内的View和回收池中的View。参数convertView实际上就是一个可回收的View。当ListView要回收这个View的时候,它的数据就会被清空。因此,当convertView不为null的时候,只需要将数据填充到里面,而不用Inflate一个新的Vi

2021-08-30 15:11:19 1088 1

转载 Android常见内存泄漏

1、非静态内部类默认持有外部类的引用会导致内存泄漏静态内部类与非静态内部类之间存在一个最大的区别,就是非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。 代码:public class Outer { private void outerDo() {} class Inter { private void innerDo() { // 内部类可以直接访问外部类成

2021-08-04 19:48:03 516

原创 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 580

原创 View事件分发相关面试题

1、View事件分发机制对屏幕的点击,滑动,抬起等一系的动作都是由一个一个MotionEvent对象组成的。根据不同动作,主要有以下三种事件类型:ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件ACTION_MOVE:手指在屏幕上移动时候产生该事件ACTION_UP:手指从屏幕上松开的瞬间产生该事件从ACTION_DOWN开始到ACTION_UP结束我们称为一个事件序列。正常情况下,无论你手指在屏幕上有多么骚的操作,最终呈现在MotionEvent上来讲无外乎下面两种:

2021-07-30 15:36:15 1589

原创 BroadcastReceiver相关面试题

1、广播的分类和使用场景分类:标准广播标准广播(normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎都会在同一时刻接收到收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。有序广播有序广播(ordered broadcasts)是一种同步执行的广播,在广播发出之后,同一时刻只会有一个BroadcastReceiver能够收到这条广播消息,当这个BroadcastRecei

2021-07-28 10:50:13 413

原创 MVC & MVP & MVVM相关面试题

1、MVC及其优缺点MVC是模型(model)-视图(view)-控制器(controller)的缩写,用一种业务逻辑、数据、界面显示分离的方法组织代码。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。其实Android app的界面开发部分已经是遵从MVC模式的:视图层(View):主要包括一下View及ViewGroup控件,可以是系统控件也可以是自定义控件。控制层(Controller):Android的控制

2021-07-27 16:22:51 1745 2

原创 Service相关面试题

1、service 的生命周期,两种启动方式的区别startServiceService的生命周期:onCreate() --> onStart() -> onDestroy()停止服务:service.stopService()bindServiceService的生命周期 onCreate() --> onBind() --> onUnBind() --> onDestroy()停止服务:UnbindService()再StopService()当app

2021-07-27 15:17:18 635

原创 Activity相关面试题

1、Activity的启动流程Activity 启动主要涉及到3个进程:系统进程 SystemServer (负责管理整个framework,是Zygote孵化的第一个进程)App进程(App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的)Zygote进程(所有进程孵化都由Zygote完成,而Zygote是init进程的子进程,也由init进程孵化)如果点击桌面icon启动还会涉及到 Launcher进程(Zygote孵化的第一个应用

2021-07-26 15:27:46 3183

原创 四大组件--Service

ServiceService既不是一个线程,Service通常运行在当成宿主进程的主线程中,所以在Service中进行一些耗时操作就需要在Service内部开启线程去操作,否则会引发ANR异常。也不是一个单独的进程。除非在清单文件中声明时指定进程名,否则Service所在进程就是application所在进程。1、生命周期Service 有两种启动服务的方式,对应的生命周期也不一致:onCreate首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次o

2021-04-28 14:18:14 169

原创 Handler相关面试题

1、消息是如何添加到队列的handler 发送一个message 时,会调用sendMessage等方法,这些方法中最终都会调用 Handler 中的 enqueueMessage 方法,我们看一下 enqueueMessage 方法做了什么://Handlerprivate boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, long uptimeMillis) { //...

2021-04-27 11:21:03 494

RecyclerView子Item移动居中的实现(TV列表移动规则的实现)

在电视界面内,焦点随着用户点击遥控器的方向键而移动,移动到单行列表边缘位置时,仍继续向屏幕可是区域外移动。 - 当列表内容超过一屏,焦点固定居中,内容项反向移动。 - 列表内容不足一屏时,焦点可移动到列表的最后一个选项。

2020-07-09

空空如也

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

TA关注的人

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