
Android学习笔记
文章平均质量分 77
每日一篇Android学习笔记,认真学习和梳理Android开发过程中的知识点。记录阅读和实践中的重点和遇到的困难。
梦否
【@】bug修复,程序代做
展开
-
HttpURLConnection之POST请求
不仅从服务器读取数据,还有向服务器写入数据的功能,是双向交互,即通过获取到输入输出流来进行相关的数据写入和读取。这个类的使用并不陌生,通常我们都是通过这个类来封装一个请求后台数据的方法,暴露给外部使用。另因我们使用的是追踪流方式,上面的抓包内容中也看见了响应的消息。方式的请求参数放置在请求体,也就是在抓包请求报文的空行之后。回顾我们所使用的请求参数方式,无论是。三个部分构成:请求方法、请求接口和协议版本。支持多种请求方法,且在该类中有完整的状态码说明。也就是紧接着的空行之上的键值对参数。原创 2023-06-22 17:31:51 · 7571 阅读 · 0 评论 -
【Android gradle】自定义一个android gradle插件之buildSrc
在【Android gradle】自定义一个android gradle插件,并发布到私有Artifactory仓库这篇文章中介绍了定义一个gradle插件,然后发布到远程或者本地仓库,最后在项目中使用的流程。但实际上还是过于复杂化了。对于自己的项目工程来说,我们希望简化这个流程,而buildSrc这个目录就运应而生了。原创 2023-01-14 23:20:33 · 2550 阅读 · 1 评论 -
【Android】修改Apk中资源文件
如题,需要修改一下apk中的asset文件夹下的资源文件字段。原创 2022-08-21 16:12:56 · 7089 阅读 · 0 评论 -
【Android Jetpack】Navigation——DeepLink
文章目录1. 前言2. 显式深层链接2.1 环境2.2 使用DeepLink2.2.1 NavController.createDeepLink()2.2.2 NavDeepLinkBuilder(context)2.2.3 完整案例3. 隐式深层链接3.1 配置nav_graph.xml3.2 配置声明3.3 调用3.3.1 应用内使用3.3.2 应用外4. 其他1. 前言Navigation中的DeepLink又叫做深层链接。在 Android 中,深层链接是指:将用户直接转到应用内特定目的地的原创 2022-05-03 08:00:00 · 1744 阅读 · 0 评论 -
【Android Jetpack】Navigation——条件导航
文章目录1. 前言2. 实现2.1 基础配置2.2 页面逻辑2.3 代码2.3.1 UserModel2.3.2 LoginFragment2.3.3 DetailFragment3. 代码地址1. 前言拟定在本小节完成条件导航案例。具体逻辑就是:一共三个Fragment,分别为游客可查看的主页、需要登录后才可查看的详情、以及登录页面。用户进入主页后,如果点击了跳转到详情页面,就判断用户是否登录。如果没有登录进入登录页面,否则显示详情页面数据。具体使用技术为Navigation、ViewMode原创 2022-05-03 08:00:00 · 699 阅读 · 0 评论 -
【Android Jetpack】Navigation——基础入门
文章目录1. 什么是Navigation2. 为什么引入Navigation3. 简单使用3.1 环境3.2 布局文件3.3 处理逻辑3.4 ActionBar返回箭头3.5 返回键设置事件4. 导航到目的地导航方式一: Navigation.findNavController(View)导航方式二: Fragment.findNavController()导航方式三: View.findNavController()导航方式四: Activity.findNavController(viewId: Int原创 2022-05-02 08:00:00 · 363 阅读 · 0 评论 -
【Android Jetpack】Room+ViewModel+LiveData
文章目录1. 前言2. 实现2.1 定义Room相关的结构1.2 定义Repository1.3 定义ViewModel1.4 定义RecyclerView1.5 定义Activity1. 前言实现内容:使用Room框架来完成数据库的CRUD操作;对于查询到的数据库数据,使用LiveData进行封装,使得每次数据库中数据更新后都可以自动渲染到RecyclerView控件;2. 实现最后效果:文件结构:2.1 定义Room相关的结构User表:@Entity(tableName =原创 2022-04-27 18:02:28 · 717 阅读 · 0 评论 -
【Android Jetpack】LiveData
文章目录1. 前言1.1 关于观察者模式2. LiveData 的优势2.1 案例一:计时器效果2.1.1 实现方式一:ViewModel+LiveData2.1.2 实现方式二:configChange1. 前言官网地址:https://developer.android.google.cn/topic/libraries/architecture/livedata其实在使用ViewModel和LifeCycle的时候,我们已经看见了LiveData这个组件。在这篇博客中将继续来了解这个组件。其特点原创 2022-04-27 17:03:29 · 1774 阅读 · 0 评论 -
【Android Jetpack】Room——基本使用篇
文章目录1. 前言2. Kotlin中的数据库操作2.1 依赖2.2 基础概念2.2 1 @Entity2.2.2 @Dao2.2.3 @Database2.3 实战3. 总结1. 前言这是一篇之前的文章,记录在看云文档中。还是决定将其整理到Jetpack这个专栏中,构成一套。下面的文章也是根据之前的开发记录来的,做了一个简单的事件记录条目的保存,下面开始正题。当然,我们所使用的就是之前使用过的SQLite数据库。可以简单回顾一下在java中是如何操作数据库的:继承自SQLiteOpenHelp原创 2022-04-21 16:43:49 · 2720 阅读 · 0 评论 -
【Android Jetpack】databinding
文章目录1. 说明2. 使用2.1 环境准备2.2 根据name长度显示Message案例2.3 响应点击事件2.4 可观察数据类型2.4.1 可观测对象2.4.2 可观测字段2.4.3 可观察集合2.5 设置数据可观察3. 自定义BindingAdapter1. 说明本篇博客参考Data Binding in Android (google.cn) 和 数据绑定库数据绑定可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。其实有点类似于MVVM框架,数据和显示的部分动态绑定原创 2022-04-19 21:31:00 · 2247 阅读 · 0 评论 -
【Android Jetpack】LifeCycle
文章目录1. 说明2. Lifecycle2.1 LifecycleObserver2.2 LifecycleOwner3. 案例3.1 案例一:使用LifeCycle解耦页面组件3.1.1 借助生命周期方法3.1.2 借助LifeCycle3.2 案例二:使用LifeCycleService解耦Service组件3.2.1. 基础版本3.2.2. 使用Service3.3. 案例三:监听应用程序的生命周期1. 说明LifeCycle它持有组件的生命周期状态信息,主要用于Activity、Fragme原创 2022-04-18 17:32:15 · 1297 阅读 · 0 评论 -
【Android Jetpack】ViewModel——在Fragment之间共享数据
文章目录1. 前言2. 实现方式2.1 方式一:借助Activity2.1.1 实现案例2.1.2 缺点2.2 方式二:使用本地广播2.3 方式三:使用ViewModel1. 前言在上篇【Android Jetpack】ViewModel——配置更改保留状态数据中简单使用了ViewModel,结合databinding可以将数据很轻松的展示在UI控件上,而不需要过多的配置、数据状态保存和恢复。而ViewModel能做到的不仅是在设备配置发生改变的时候状态保存,还可以用作Fragment之间的数据共享。可原创 2022-04-17 17:13:14 · 4916 阅读 · 1 评论 -
贝塞尔曲线及实践案例
文章目录1. 前言2. 介绍2.1 一阶贝济埃曲线2.2 二阶贝塞尔曲线2.3 三阶贝塞尔曲线3. 一、二、三阶贝塞尔曲线实现4. 案例5. 后记1. 前言贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。2. 介绍2.1 一阶贝济埃曲线一阶贝济埃曲线的公式如下: B(t)=(1-t)P原创 2022-03-15 16:19:54 · 4127 阅读 · 1 评论 -
自定义ViewPager和滑动冲突解决
文章目录1. 自定义ViewPager2. 滑动冲突2.1 环境构建2.2 环境构建中问题排查2.3 滑动冲突解决1. 自定义ViewPager比如在自定义ViewPager中,中的某个子页面使用了一个scrollView。对于自定义ViewPager这里再次复习一下:定义对应的类,继承自ViewGroup,并复写onLayout方法,使得所有的页面在逻辑上是连着的。通过addView来添加子视图,这里直接使用ImageView,然后为其指定Background;通过上述步骤后,就可以显示出来一原创 2022-02-28 18:56:19 · 2239 阅读 · 0 评论 -
Android路由——基础设计思想
文章目录1. 前言2. 最简单的实现思路3. 改进4. 继续改进4.1. 获取Apk文件所有的类4.2 针对4中第三个问题进行简单改进4.2 针对4中第二个问题进行简单改进1. 前言对于一个组件化的项目而言,路由的引入必不可少。主要是为了减少组件之间的代码耦合。而路由的最简单的设计思路就是可以在全局的某一个地方来生成一个对应Activity的路由信息表。在Activity要进行模块内或者组件之间的跳转的时候就可以进行查表跳转。那么对应的最简单的实现思路就是:2. 最简单的实现思路我们另起一个项目公原创 2021-12-12 13:48:03 · 2618 阅读 · 0 评论 -
Environment.getExternalStorageDirectory()过时
Environment.getExternalStorageDirectory()过时原创 2021-12-05 12:40:53 · 7371 阅读 · 0 评论 -
上传Android library到JitPack
文章目录1. 前言1.1 创建模块1.2 添加android-maven插件1.3 设置自定义库的gradle1.4 上传项目到github1.5 创建一个release版本1.6 继续打开JitPack1.7 使用:2. 快捷方式1. 前言当然首先需要科学上网,可以简单的使用Edge的扩展插件SetupVPN:然后需要在github上创建一个项目,并且在这个仓库中添加一个release,如下图:这里我上传到release的为我这个插件的aar包,至于怎么得到aar包,可以参考博客:Andro原创 2021-11-23 10:56:47 · 1029 阅读 · 0 评论 -
Android启动页白屏/黑屏问题解决
文章目录1. 前言2. 解决2.1 纯色背景2.2 设置背景图片3. 最终方案1. 前言记得之前记录过这个问题怎么解决,但是在自己的这个博客中确实没有找到。所以还是继续记录一笔。为了更加直观的说明这个问题,这里我随意创建了一个应用,然后做一个录屏:在上面的动态图片中,可以看到打开系统自带、自己创建应用均有启动的黑屏显现。但是自己在平时实际中使用App的过程中,却没有看见过这个显现,取而代之的是一个启动页面。这种效果更加友好,所以这里也来记录下怎么解决这个问题。2. 解决解决方式其实就是自定义主题原创 2021-10-28 10:45:29 · 1962 阅读 · 0 评论 -
如何预防Handler内存泄漏?
今天面试爱奇艺二面的时候,面试官提到了使用静态Handler。而实际中自己在工程中确实没有想到这个方法。所以这里来再次总结下为了防止Handler内存泄漏有哪些手段?文章目录1. Handler为什么会造成内存泄漏?2. 预防Handler内存泄漏?2.1 使用静态Handler2.2 清空消息队列2.3 使用静态Handler+弱引用WeakReference3. 最终版本1. Handler为什么会造成内存泄漏?这就需要从消息机制的原理说起。因为在之前的博客,或者网上有很多介绍这部分原理,所以这里原创 2021-09-28 10:14:48 · 1185 阅读 · 1 评论 -
Android平台架构
在Android官方文档的在线培训中,发现还是有8个教学视频的,之前没怎么注意。刚刚看到Developing Android Apps with Java的第一课中的Android Software Stack,感觉还可以。这个视频中将Android的平台架构形象化的描述为如下图示:然后,我们再结合原本网络中常见的Android平台架构图,感觉更加容易一眼记住,如下:记录这个是因为昨天涂鸦面试问到了这个问题,而刚好刚刚看到了。...原创 2021-09-23 10:02:44 · 231 阅读 · 0 评论 -
Bitmap的加载和ImageLoader的封装
这篇博客主要是解决如何高效加载Bitmap的问题,因为Android中加载Bitmap的时候容易出现内存泄漏问题,故而如何高效加载比较重要。文章目录1. 基础知识2. 高效加载Bitmap3. ImageLoader实现3.1 内存缓存3.2 磁盘缓存3.3 从网络请求图片3.4 整合为一个完整流程4. 用例测试5. 完整代码5.1 目录结构:5.1.1 Utils.java5.1.2 DiskLruCacheHelper.java5.1.3 ImageLoader.java5.1.4 MImageVie原创 2021-09-21 20:31:58 · 378 阅读 · 0 评论 -
A启动B,B启动C,当C返回的时候,返回到A
我一直以为这个问题是一个比较初级的问题,可以简单的设置B的启动模式为singleInstance即可。但实际上存在一个Bug,比如这里的示例,我一共新建了三个Activity,如下所示:<activity android:name=".activities.TestActivity" android:launchMode="singleInstance" /><activity android:name=".activities.ThreeActivity"/&原创 2021-09-18 16:14:19 · 531 阅读 · 0 评论 -
LeakCanary原理?
文章目录前言1. LeakCanary的使用案例2. LeakCanary原理前言依稀记得有场面试问过这个问题。虽然已经忘记是哪场面试,这里还是做一个记录和学习。我们都知道使用LeakCanary这个第三方依赖主要是为了避免内存泄露问题。当应用异常退出的时候,我们为了重现问题,通常需要去寻找特定的机型。但实际上并不怎么现实,且手段比较粗暴。我们希望在发生内存泄露的时候,可以把内存 Dump 出来。然后就可以借助MAT 等工具来进行内存分析,确定哪里代码的引用不是必须的。而LeakCanary只需原创 2021-09-15 16:42:03 · 176 阅读 · 0 评论 -
小红书二面的一些记录
今天面试小红书二面,感觉整体上考察还是比较基础。根据小红书面试官透露,在开发中使用kotlin比较多;公司有跨平台的,但还是原生比较多。这里就记录几个回答不是怎么好的问题:1. 实现线程安全队列首先是实现一个队列,可以自动扩容,底层为int[] 类型。对于怎么以最小的代价来保证其线程安全,这里可能我说的不是最优的,这里需要看下Java相关类的设计思想。首先给出我的非多线程版本:class Queue{ private int[] arr; int preIndex = 0;原创 2021-09-10 21:44:29 · 882 阅读 · 0 评论 -
Message对象的when?Hanlder是如何将一个延迟消息添加到消息队列的?
1. 前言今天在面试三七互娱的时候两个面试官轮流上阵,那个时候确实是比较虚的,幸好问的都还知道。只是对于Handler消息机制中如题的两个点,确实没有怎么注意过,也没有达出来。这里记录下。2. 解答平时没怎么用到过这个字段,经常用的是what和obj这两个字段。那么就来看下这个when。先百度下:what区分消息要做的事情,when表示什么时候发生的。害,这么说来延迟消息的应该也就是一样加入到消息队列,只是标识了执行的时机,使用when来标识。那么岂不是面试官当时连着这两个问题是在做提示?麻了原创 2021-09-08 22:09:43 · 484 阅读 · 0 评论 -
Fragment使用为什么要开启事务?Fragment怎么进行查找?
1. 前言今天在面试顺丰的时候遇到了这两个问题。平时确实没有注意过这两个问题,这里记录下。另外面试过程了解到顺丰偏向于款平台开发,不太偏向Android原生开发。所以在面试过程中还问了前端的知识,比如为什么使用虚拟Dom、Vue的渲染过程等。Fragment怎么进行查找;Fragment为什么要开启事务;2. 解答同样的,为了解答这个问题,可以做一个小案例。就使用FrameLayout来实现一个小案例。案例效果:点击对应的底部Tab可以切换。activity_main.xml文件:&l原创 2021-09-08 21:21:24 · 649 阅读 · 0 评论 -
SharedPreferences线程安全吗?commit和apply的区别?
1. 前言今天面试爱奇艺的时候遇到了这个问题。确实是比较懵的,因为:平时在使用的时候都是单个App做自动登录,所以一直都是一个线程在操作,也就没有思考过SharedPreferences在多线程下还安全吗这个问题。对于commit和apply之前看一些博客说commit更好,所以一直也就使用的commit,所以还真没有怎么注意过。对于这两个问题,这里重新整理下。2. 问题解答2.1 小案例为了回答这个问题,可以做一个小案例,就是使用多个线程来并发的操作下,我们来看看是否安全。public原创 2021-09-07 18:11:13 · 2311 阅读 · 0 评论 -
SwipeMenuListView使用
1. 前言 之前在项目中使用过这个开源插件,主要是为了实现ListView的Item的侧滑效果,结果也证实了这个库用的挺舒服的。就企图在接下来的日子来看看它的设计原理和一些技巧。当然,首先还是按照惯例来对它的使用来做一个说明,记录下。2. 使用说明在github的仓库地址SwipeMenuListView中作者为如何使用提供了详细的说明,就按照这个过程来操作一波。后台Controller:@RestControllerpublic class RetrofitController {原创 2021-09-05 14:33:49 · 592 阅读 · 0 评论 -
RecycleView的缓存机制
1. RecycleView的基本用法和ListView类似,定义好Adapter和对应的xml布局文件,然后进行关联即可。唯一不同之处在于在RecycleView中需要设置布局管理器。1.1 后台接口和前几篇文章类似,本次案例数据从后台SpringBoot服务器加载,对应Controller:@RestControllerpublic class RetrofitController { @GetMapping(value="/test/1.0/users") public S原创 2021-09-03 20:38:42 · 621 阅读 · 0 评论 -
OkHttp缓存机制分析和使用案例
文章目录1. OkHttp缓存机制部分源码查看1.1. CacheInterceptor缓存拦截器1.2. CacheStrategy缓存策略类1.3. DiskLruCache磁盘缓存类2. 缓存案例2.1 场景:服务器响应首部没有HTTP缓存控制信息1. OkHttp缓存机制部分源码查看为了方便在AndroidStudio中查看源码,这里更换4.9.0版本为:implementation 'com.squareup.okhttp3:okhttp:3.12.0'如果需要其他的版本,可以在mvnr原创 2021-08-31 17:52:17 · 414 阅读 · 0 评论 -
OkHttp的HTTP缓存使用
1. 前言 在HTTP缓存机制中曾提到过HTTP的缓存机制氛围强缓存和协商缓存。而这两种缓存的实现,均是通过HTTP协议的头部信息的字段来进行控制的,然后会根据过期时间来判断是否直接从本地缓存加载数据。在OkHttp网络访问框架——GET、POST、文件上传和拦截器的使用一文中提到过,OkHttp是一个高效的HTTP客户端,它有以下默认特性:支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接,即socket复用;连接池减少请求延时;透明的GZIP压缩减少响应数据的大小原创 2021-08-31 12:16:27 · 988 阅读 · 1 评论 -
Retrofit的使用案例
官网地址:Retrofit,注意到:原创 2021-08-29 16:15:26 · 694 阅读 · 0 评论 -
Window对象
在Android中我们都知道有一个唯一的Window的实现类,也就是PhoneWindow类。Android中所有的视图都是通过Window来呈现的,Window实际是View的直接管理者。Window的类型可以大致分为三种:应用Window,即:Application Window,对应的也就是一个Activity。对应层级1~99;子Window,即:Sub Window,不能单独存在,需要附属在父Window中,比如Dialog。对应层级1000~1999;系统Window,即:System原创 2021-08-27 17:03:25 · 181 阅读 · 0 评论 -
View的绘制原理
在View的绘制流程一文中曾简略提到过相关的绘制流程。这里再来重新总结下。要了解View的绘制原理,我们需要再看一遍这个图:我们通过setContentView来将一个布局文件添加到ContentView容器中,在这之后才有各个View的绘制。故而我们可以先从这个方法入手:// MergeTestActivity.javasetContentView(R.layout.activity_merge_test);// AppCompatActivity.javapublic void set原创 2021-08-21 18:37:03 · 781 阅读 · 0 评论 -
用IdleHandler来做闲时等待
在MessageQueue类中定义了一个公开静态接口,即IdleHandler:public static interface IdleHandler { /** * Called when the message queue has run out of messages and will now * wait for more. Return true to keep your idle handler active, false * to have it re原创 2021-08-21 17:15:30 · 270 阅读 · 0 评论 -
Glide图片加载框架的使用
1. 介绍Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide几乎可以胜任任何你需要使用到图片从网络拉取,压缩,显示的场景。Glide的使用非常方便,相信下面的使用流程大家都不陌生:Glide.with(context) .load(图片路径) .into(imageView);.原创 2021-08-20 22:14:12 · 3124 阅读 · 1 评论 -
线程池ThreadPoolExecutor
文章目录1. 线程的创建1.1 `FutureTask`和`Callable`实现1.2 线程池`Executor`1.2.1 `ThreadPoolExecutor`介绍1.2.2 `ThreadPoolExecutor`简单使用案例1. 线程的创建在Java中一共有四种创建线程的方式,分别是:继承Thread类,然后new Thread().start();实现Runnable接口,然后new Thread(new Runnable()).start();使用Callable和Future创原创 2021-07-27 17:14:45 · 282 阅读 · 0 评论 -
Android中的性能优化方法
文章目录1. 为什么要进行性能优化2. 提高应用性能的优化方向2.1 布局优化2.1.1 merge标签2.1.2 ViewStub标签2.2 绘制优化2.3 内存泄露2.3.1 静态变量导致的内存泄露通过AndroidStudio Profiler工具检测内存泄露2.3.2 单例模式导致的内存泄露2.3.3 其他情景下的内存泄露2.3.4 Handler 造成的内存泄露2.4 响应速度优化2.5 ListView优化2.6 Bitmap优化2.6.1 Bitmap质量压缩2.6.2 Bitmap尺寸压缩2原创 2021-08-19 15:11:26 · 1003 阅读 · 0 评论 -
ThreadLocal工作原理
在使用Hanlder消息机制的时候,曾简单阅读过Handler的部分源码,我们知道其消息机制中有如下几个重要部分:Handler;Looper;MessageQueue;Message;ThreadLocal;对于ThreadLocal这里来进行再一次的源码分析和理解。在使用Handler消息机制中,我们在每个线程中可以很轻松的得到Looper对象,比如Looper.myLooper();(当然,需要是你之前Looper.prepare()过)。我们知道每一个线程中都有一个与之关联的Loo原创 2021-08-16 17:22:07 · 200 阅读 · 0 评论 -
OkHttp网络访问框架——可见的设计模式
在上篇OkHttp网络访问框架——GET、POST、文件上传和拦截器的使用中简单使用了几种网络请求方式。比如下面的简单get请求:OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new MyLoggingInterceptor()) // 添加拦截器 .build();Request request = new Request.Builder() .url("h原创 2021-08-15 18:38:24 · 293 阅读 · 0 评论