自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 展开说说:Android之ContentProvider源码浅析

分析了ContentProvider相关组件的源码执行流程。1) ContentProvider的生命周期早于Application,其onCreate在ActivityThread初始化时首先被调用;2) ContentResolver是必须的通信桥梁,通过URI匹配ContentProvider并调用其方法;3) 详细解析query方法的执行流程:先获取IContentProvider代理对象,通过AMS跨进程创建或激活ContentProvider,最终调用自定义的ContentProvider实现类

2025-06-28 19:32:34 1024

原创 展开说说:Android四大组件之ContentProvider使用

Android中的ContentProvider是四大组件之一,用于跨应用共享数据,通常配合ContentResolver和ContentObserver使用。本文通过两个实例进行说明:1)读取联系人信息:申请权限后通过Intent启动通讯录,获取联系人姓名和手机号;2)自定义ContentProvider:继承ContentProvider实现数据库的增删改查功能,并通过ContentObserver监听数据变化。关键点包括URI匹配、权限申请和组件注册,适合需要实现数据共享的Android开发场景。

2025-06-22 20:16:03 546

原创 展开说说Android之Retrofit详解_源码解析

本文主要从六个方面分析了Retrofit源码实现:首先介绍了Retrofit的核心类和接口,包括Retrofit类、ServiceMethod类等;接着解析了@GET、@POST等注解的作用;然后通过OkHttpCall类揭示了Retrofit封装OkHttp的实现;解释了Retrofit异步请求能在主线程返回的原理;梳理了请求的完整流程;最后总结了Retrofit的优缺点。文章详细呈现了Retrofit从注解解析到最终请求实现的完整机制,特别是通过动态代理和线程切换的实现细节

2025-06-20 00:21:46 880 2

原创 展开说说Android之Retrofit详解_使用篇

Retrofit是基于OkHttp的类型安全HTTP客户端框架,通过动态代理将接口注解转化为网络请求。文章介绍了Retrofit的配置与使用:1)添加Retrofit和转换器依赖;2)定义请求接口,支持GET/POST/文件上传等操作;3)通过单例工具类封装Retrofit初始化;4)演示了GET请求、POST请求、文件上传等常见场景的实现。Retrofit主要面向应用层封装,底层网络请求仍由OkHttp处理,两者配合使用能简化网络请求开发流程。文中还涉及动态URL、请求头设置等高级用法,并提供了完整的示例

2025-06-16 23:56:14 405

原创 展开说说Android之Glide详解_源码解析

本文分析了Glide图片加载框架的核心源码实现。主要介绍了Glide初始化过程、三级缓存调度机制和图片加载流程。核心类包括Glide(入口)、RequestManager(生命周期管理)、Engine(缓存调度)、RequestBuilder(参数构建)等。重点解析了从Glide.with()开始,通过RequestManager绑定生命周期,最终由Engine协调内存/磁盘缓存,并通过DecodeJob线程池解码图片的全过程。网络图片加载采用HttpURLConnection实现,最后通过Target将图

2025-06-14 19:31:52 1205

原创 展开说说Android之Glide详解_使用篇

本文详细介绍了Android开发中广泛使用的Glide图片加载库。基础用法包含with()、load()、into()三个核心方法,支持本地资源、网络图片等多种加载方式。进阶功能包括错误图片设置(placeholder/error)、尺寸控制(override)、缓存策略(diskCacheStrategy)等配置选项。特别说明Glide对GIF的支持、网络请求头设置以及文件流加载等特色功能。文章基于Glide4.0.0版本,涵盖从基础到高级的完整使用方案,为开发者提供

2025-06-12 22:28:41 613

原创 Android写一个捕获全局异常的工具类

本文介绍了如何利用Thread.UncaughtExceptionHandler实现Android全局异常捕获,将崩溃日志保存到本地文件。主要步骤包括:1. 自定义CrashHandler类实现UncaughtExceptionHandler接口,重写uncaughtException方法;2. 在方法中收集设备信息、异常堆栈和时间信息;3. 将日志写入外部存储的指定目录文件;4. 在Application初始化时注册该处理器。该方法无需网络请求即可实现崩溃日志本地化存储,为后续问题分析提供可靠依据

2025-06-08 18:56:40 637

原创 oppo手机安装APK失败报错:安装包异常

这里主要是因为入口的启动页没有设置exported属性,导致的安装失败。这个值true表示允许其他应用启动这个Activity,false则是不允许。我们这个是launcher Activity因此设置了true,如果false也可以但会发现通过Android Studio启动时只会给你安装好了但不会启动我们的app,需要手动点一下桌面图标。也给oppo官方打了电话之中都没解决,直到最后借到了一个可以复现问题的手机连数据线在控制台看到上面的日志,一行代码解决了问题。新建项目默认是没有设置这个属性的,

2025-05-18 23:13:32 1313

原创 okhttp源码解析

在OkHttp中,构建了一个阀值为[0, Integer.MAX_VALUE]的线程池,它不保留任何最小线程数,随时创建更多的线程数,当线程空闲时只能活60秒,它使用了一个不存储元素的阻塞工作队列,一个叫做OkHttp Dispatcher的线程工厂。`Request` 用于定义具体的 HTTP 请求,包括 URL、方法、头部和请求体等。BridgeInterceptor:桥接应用层和网络层,添加必要的请求头信息,如 `Content-Encoding`、`Cookie`、`User-Agent` 等。

2025-03-10 22:51:32 1290

原创 网络编程基础知识总结

网络编程说的是在不同计算机之间进行数据传输和通信。本文主要是一些基础知识的总结:本文的“计算机”包含电脑、手机、平板、手表、汽车等可以联网的设备。

2025-01-08 22:17:39 779

原创 展开说说:Android页面绘制流程源码解析

说到Android系统View的绘制流程,大家一定知道是分为测量(Measure)、布局(Layout)和绘制(Draw)三个阶段,这篇文章主要聊一聊在这三个步骤之前的源码执行流程,页面启动后是怎样通过代码执行这三个方法。

2024-07-14 23:08:27 1125

原创 展开说说:Android之View基础知识解析

View虽不属于Android四代组件,但应用程度却非常非常广泛。在Android客户端,君所见之处皆是View。我们看到的Button、ImageView、TextView等等可视化的控件都是View,ViewGroup是View的子类因此它也是View。但是现在我们把View和ViewGroup当成两个类来看待,ViewGroup可以容纳View和ViewGroup,但View不可以再容纳其他View或ViewGroup,这种容纳的关系可以一直延伸仿佛一棵大树,从内而外有了父子关系,因此有个概念叫做Vi

2024-07-13 23:11:02 1523

原创 展开说说:Android服务之实现AIDL跨应用通信

AIDL技术跨进程通信可以理解为是服务端和客户端之间的通信(IPC),定义Service的进程称为服务端,调用服务的进程就是客户端。

2024-07-09 22:37:47 1164 2

原创 展开说说:Android服务之bindService解析

前面两篇文章我们分别总结了Android四种Service的基本使用以及源码层面总结一下startService的执行过程,本篇继续从源码层面总结bindService的执行过程。本文依然按着是什么?有什么?怎么用?啥原理?的步骤来分析。bindService使用方法和调用流程都与startService时有很多相似之处,方便的话请先阅读上一篇《展开说说:Android服务之startService解析》。

2024-07-08 22:03:08 2973

原创 展开说说:Android服务之startService源码解析

通过上一篇文章我们掌握了Android四种的基本使用,本篇从源码层面总结一下startService的执行过程。本文依然按着是什么?有什么?怎么用?啥原理?的步骤来分析。

2024-07-06 17:05:20 1274

原创 展开说说:Android四大组件之Service使用

Service一定要开启子线程才可以执行耗时任务吗?不完全是吧。Service是Android系统中的四大组件之一,它是一种没有可视化界面,运行于后台的一种服务程序。属于计算型组件,用来在后台执行持续性的计算任务,重要性仅次于Activity活动。

2024-07-04 22:07:02 768 1

原创 谁说Android子线程一定不能更新UI

谁说的Android子线程一定不能更新UI,不用handler、View的post和Activity的runOnUiThread特定情况下一样可以再子线程更新UI。天下武功,唯快不破。先说一下结论,在Activity的onCreate方法执行入口创建子线程然后内部更新UI是可以正常更新的,不会抛异常发生闪退。但是,如果晚一会就不行了,前面加个1秒延时就会闪退。

2024-06-30 23:28:41 1308

原创 Android常用加解密算法总结

Android开发中对于数据的传输和保存一定会使用加密技术,加密算法是最普遍的安保手段,多数情况数据加密后在需要使用源数据时需要再进行解密,但凡是都有例外。下面从可逆加密、不可逆、不纯粹加密三种方式记录一下常见的加解密算法。加密技术包括两个元素:算法和密钥:算法使用密钥将明文数据变成无法辨识的密文。以下代码是点击事件里调用SecurityUtil工具类,加解密算法都再SecurityUtil中实现。

2024-06-30 20:03:28 1400

原创 Android隐藏状态栏和修改状态栏颜色_亲测有效

本文记录了隐藏状态栏和修改状态栏颜色以及电量、WiFi标志等内容的模式显示,亲测有效。

2024-06-29 21:56:59 1614

原创 展开说说:Android列表之RecyclerView

RecyclerView 内置ViewHolder,省去了每次findViewById() 创建视图;当列表滑动的时候,只有少量相邻的视图会被创建。当视图滑出屏幕时,RecyclerView 会复用它并且填充新的数据。由于它是通过回收已有的结构而不是持续创建新的列表项,所以它可以有效提高应用的时间效率和空间效率。

2024-06-27 22:39:01 1046

原创 展开说说:Android之WebView详解

onPageStarted是在onProgressChanged执行之后才会执行;onPageFinished是在onProgressChanged加载到100之后才执行;onReceivedError如果执行一定是在onPageFinished之后还需要注意Android原生调用js需要在onPageFinished回调之后再调用否则不生效,因为B页面还没加载完你喊破嗓子它也不理你.

2024-05-08 23:30:57 2366

原创 展开说说:Android线程池解析

何谓线程池?本人理解是存放和管理线程的一个容器。线程池存在的意义是什么?第一:前面博客提到过创建和销毁线程的操作本身是有性能开销的,如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本,使用越频繁就越能节省性能,毕竟省到就是赚到嘛。第二:方便的管理线程,避免很多线程同时争抢资源引发阻塞。毕竟是人家封装过的,因此有专门的属性参数来控制核心线程数、最大并发数、非核心线程的最大限制时长等。

2024-05-07 22:47:19 986

原创 展开说说:Android实现多线程解析

通过日志可以看出AsyncTask执行异步任务的逻辑是先执行onPreExecute方法让我们做一些准备工作,然后doInBackground方法被回调做耗时任务,需要主动调用publishProgress方法,然后onProgressUpdate被回调,doInBackground中伪造了十秒延时后再次主动调用publishProgress方法onProgressUpdate再次被回调,最后任务执行结束以后onPostExecute被回调返回执行结果。

2024-05-05 22:33:06 966

原创 展开说说:Android实现多线程几种方式

Thread类的start()方法和run()方法的主要区别在于人家扮演的角色压根就不一样。以下是两者的主要区别:首先达到的效果不同。run()方法是线程中实际运行的代码,他就是仅代表调用run方法而已;start()方法是启动一个新线程,它会创建一个新的线程并在新的线程中并行执行run方法的任务。因此在实际的多线程编程中,应该通过调用start()方法来启动线程。

2024-05-04 12:54:56 1312 1

原创 展开说说:Android Fragment完全解析-卷三

本文章分析了Fragment的管理器FragmentManager、事务以及完整的声明周期和动态加载Fragment的原理解析。

2024-05-03 13:32:04 1340 2

原创 展开说说:Android动画之自定义动画

本篇记录一个小球沿着正弦曲线运动并且自身不断放大缩小还能变换自身颜色的属性动画。1、梳理一下实现上面效果的需要用到那些知识点:1.1这个动画的主角是“一个小球”因此我们需要使用canvas绘制一个小球,为了突出它是是沿正弦曲线运动我们在屏幕上加一条横线,同样使用canvas绘制1.2 正弦曲线就需要ValueAnimator使用自定义一个估值器继承TypeEvaluator,计算小球的运动轨迹1.3 小球放大缩小也需要一个ValueAnimator计算小球的半径1.4 变换小球自身颜色,

2024-05-01 18:44:36 1005

原创 展开说说:Android动画之插值器和估值器

上一篇写了Android三种动画的使用,这里分析一下属性动画的两个属性插值器和估值器。1.1 描述TimeInterpolator、Interpolator、BaseInterpolator以及一些其他的XXInterpolator,一眼望去您认为谁是插值器的顶级父类,3、2、1,没错是TimeInterpolator,因此严格意义上来说他好像应该叫时间插值器。其实我的第一错觉Interpolator才是,下图可以看出来我真的错了。

2024-04-25 23:30:39 1124 3

原创 展开说说:Android动画使用

属性动画Animator是个抽象类,有三个子类ValueAnimator、AnimatorSet,而TimeAnimator和ObjectAnimator是ValueAnimator的子类、我们都是在使用他们四个实现动画。补间分为平移动画translate、缩放动画scale、旋转动画rotate、透明度动画alpha以及动画合集set,用发基本类似此处以缩放动画为例。补间动画也可以在java代码中实现,这里其实完成了上面的第一步和第二部,有了animation对象其他的都一样了。实例去执行或者关闭动画。

2024-04-25 07:13:51 1254 5

原创 展开说说:Android Fragment完全解析-卷二

3.1 ViewPager为什么可以滑动?因为ViewPager重写了View类的computeScroll方法,并在computeScroll中调用onPageScrolled并且里还调用了view的scrollTo实现view滑动,重写view中的这个方法,computeScroll和scrollTo配合专门负责实现滑动的

2024-04-21 22:31:49 1021 2

原创 展开说说:Android Fragment完全解析-卷一

Fragment 它很独立,它可以定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。Fragment 很粘人,它不能独立存在。它们必须由 activity 或其他 fragment 托管(即fragment可以内嵌fragment使用)。同一 activity 或多个 activity 中可以使用同一 fragment 类的多个实例,但是要注意解耦避免让一个 fragment 依赖另一个 fragment 或在一个 fragment 操控另一个 fragment。

2024-04-20 19:28:03 916

原创 Android studio顶部‘app‘红叉- Moudle ‘XX.app’ dosen’t exist in project

找到settings.gradle文件检查是否有include ':app'。如果没有要加上;如果已经有了就先把它注释了然后点Syno Now,此时它开始编译了不会无动于衷袖手旁观了。最后把include ':app'这一行放开再点Syno Now问题解决。

2024-04-16 22:26:15 1898

原创 Android-Handler详解_原理解析

5.1 handler的sendMessge相关的一些方法用来发消息,post方法其实最后也会调到send方法,然后通过enqueueMessage方法调用MessageQueue的enqueueMessage方法存储消息。5.2 handler的handleMessage方法或者Handler.CallBack的handleMessage方法,以及post方法的run回调方法。5.3 消息队列MessageQueue提供了enqueueMessage和next两个方法分别用来

2024-03-27 23:47:55 1618

原创 Android-Handler详解_使用篇

我理解的Handler消息机制:以寄快递为例,我是Handler、快递员是Looper、商品仓库是MessageQueue、Messge是我下单消息寄出的物品。放假我Handler把电脑从公司寄回老家,我填写老家的地址就是声明handleMessage方法、我下单就是sendMessage我把电脑送到快递公司仓库MesssageQueue、然后经过快递公司内部流转,我老家的快递员Looper从仓库MessageQueue取出商品,根据地址送到我老家handleMessage方法。

2024-03-27 23:39:24 1464

原创 展开说说:Android之SharedPreferences

是个接口它的内部接口是Editor,里面定义了上面五个数据类型的put方法,以及putString、remove、clear、commit、apply方法。父级接口定义的,因此增加、删除、清空方法需要使用edit但get方法不用,下面距离分别验证这些方法。在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。如果需要存取比较复杂的数据类型,则需要对这些数据进行。上面可以看出getxx方法不在Edit接口中,他们是在。中引入的,调用它会安全的异步写入。

2024-03-16 23:54:00 1406

原创 HarmonyOS-鸿蒙系统概述

华为“1+8+N” 全场景智慧战略,其中居于核心的“1”是智能手机,“8”是指围绕手机的车机、音箱、耳机、手表/手环、平板、大屏、PC、AR/VR产品,N则指众多泛IoT设备。

2024-03-16 16:35:59 3000 2

原创 HarmonyOS-页面跳转Router实例演示

本文将以APP的登录和修改昵称为例演示官网的几种页面跳转、返回以及这些流程携带参数,实例的形式记录学习HarmonyOS的页面跳转。

2024-03-12 23:31:38 2284

原创 JAVA泛型浅析

Java范型generics,是JDK1.5引入的新特性,是一种编译时类型安全检测机制,可以在编译时检测到非法的类型。定义泛型参数时还可以使用继承,例如 ,后面都可以使用User类或它的子类接收在必要的时再强转指定类型。在方法调用时检测类型,在返回值类型之前的是范型方法的象征,此处表示声明了一个范型T,范型数量也可以多个比如;当实现范型接口的类不传范型实参:比如下面的也需要在类名增加GenericInterUser1和接口一样的范型。

2024-02-28 23:28:14 624

原创 鸿蒙-HarmonyOS之初见

运行项目是需要先到上面这个页面点击绿色三角启动模拟器,上面红色方块代表模拟器已经启动成功,然后到工程页面点击绿色三角启动项目在模拟器运行,如下图。官网地址:https://developer.huawei.com/consumer/cn/当前最新的版本3.1 ,windows和Mac,Mac又分了arm和x86的CPU。新建项目自带有的代码,左侧目录结构有点像Android又有点像小程序。在这个页面进行创建,首次创建需要先下载,按顺序点击即可。修改World为Harmony,至此项目已经运行起来了,

2023-12-21 23:01:58 870

原创 展开说说:Android之常用的延时执行策略

耗时很短,但是也是有一定开销足以让它在主线程顺序之后执行,以上代码测试发现从new Thread到子线程内第一行代码执行耗时不足1毫秒。第二种和第三中都依赖Handler,先定义一个handler。适用一直在后台运行的定时任务,此处放在一个。200)就会先执行主线程然后进入子线程,lock.wait(2000)放开,放开,lock.wait(2000)是线程的方法,他休眠中不会释放锁。200),就会先进入子线程执行完。是线程的方法,他休眠中不会释放锁。200毫秒延时也就是注释。的方法,他休眠会释放锁。

2023-12-19 22:50:20 1744

原创 Android 运行报错Failed to open zip file.Gradle‘s dependency cache may be corrupt (this sometimes occurs

Android Studio 运行项目报错:Failed to open zip file.Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)Re-download dependencies and sync project (requires network)

2023-12-17 22:32:20 1197

空空如也

空空如也

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

TA关注的人

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