自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何在Flutter中使用flutter_markdown

然后安装flutter_markdown依赖失败,考虑到project name 和 flutter_markdown重名了,那就换一个项目名称。然后flutter pub get 然后又报错了,flutter_markdown依赖另外一个markdown package。很多博客,论坛都支持markdown语法,flutter也有支持markdown语法的插件。创建markdown文件,放开pubspec.yaml 静态文件路径。保存后,编辑器自动下载依赖,或者执行。在创建项目之初,随手就创建了。

2023-04-10 18:58:58 2172 1

原创 事件分发机制 ViewGroup分析

事件分发从手指触摸屏幕开始,即产生了触摸信息,被底层系统捕获后会传递给Android的输入系统服务IMS,通过Binder把消息发送到activity,activity会通过phoneWindow、DecorView最终发送给ViewGroup。这里就直接分析ViewGroup的事件分发。

2023-04-09 21:56:18 309

原创 Android事件分发之前流程详解

打开Android Studio 运行一个项目 然后选择Android Studio上方的Tools -> Layout Inspector -> 选择你的项目,然后会生成一个li文件在View Tree可以清楚的看见你的页面布局结构,图中蓝色的部分就是的布局文件 我们看到除了自己的布局文件外,还有一些系统定义的布局,在这些布局中,最外层的View就是DecorView根据事件分发的机制可以知道,事件是最外层View 即DecorView分发给子View的。

2023-04-08 19:51:02 335

原创 原来你是这样的AAC——Lifecycle的使用及原理

利用Lifecycle提供的两个接口和,让功能组件具有感知生命周期的能力提供了onCreate~OnDestroy各个生命周期的回调方法,并提供了默认实现,按需重写只提供了一个onStateChanged接口,可根据传入的参数判断当前所处的生命周期状态旧版本的Lifecycle使用的是接口,然后在功能组件中通过注解的方式去添加各个生命周期的回调逻辑,这种使用起来很麻烦,目前已经声明为废弃了。

2023-04-07 14:06:45 352

原创 Android URL Scheme数据还原流程与踩坑分享

唤端的逻辑全部在闪屏页的onCreate生命周期做。只有在冷启唤端时需要先跳转至首页,首页再跳转至模板页面。剪贴板的逻辑,冷启时在闪屏页做剪贴板的获取与解析,热启时在页面基类做剪贴板的获取与解析,解析完数据后统一在页面基类进行目标页面的跳转。之所以放在页面基类而不是首页,是因为热启回APP后可能处于任意一个页面,所以这段逻辑只能放到基类里面去处理。另外需要注意的一点是,闪屏页的LaunchMode需要设置为singleTask,否则唤端启动时新创建的闪屏页会到浏览器的栈去,不符合业务需求。

2023-04-06 14:46:28 394

原创 Android代码静态检查(lint、Checkstyle、ktlint、Detekt)

CheckStyle不支持kotlinKtlin和Detekt两者对比Ktlint它的规则不可定制,Detekt工作得很好并且可以定制,尽管插件集成看起来很新。虽然输出的格式都支持html,但显然Detekt输出的结果的阅读体验更好一些。以上相关的插件因为都支持命令行运行,所以都可以结合Git 钩子,它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。不同团队的代码的风格不尽相同,不同的项目对于代码的规范也不一样。

2023-04-04 21:55:07 348

原创 ViewModel中的StateFlow和SharedFlow,使用建议以及单元测试

以读取数据库数据为例,Repository负责从数据库读取相应数据并返回一个flow,在ViewModel收集这个flow中的数据并更新状态(StateFlow),在MVVM模型中,ViewModel中暴露出来的StateFlow应该是UI层中唯一的可信数据来源,注意是唯一,这点跟使用LiveData的时候不同。很简单,将之转换成热流就好了!关于在UI层收集ViewModel层的热流方式,官方文档已经有介绍,但是没有补充在JetPack Compose中的收集流方式,下面补充一下。

2023-04-03 19:43:02 365

原创 每周一个自定义View(1) -动态ProgressView

这次就从一个常见的ProgressBark开始吧, 最近的项目中使用了一个Progress显示文件下载进度的功能, 设计给的是一个静态的图片, 也没有说需要具体实现的情况, 后面优化的时候刚好有了性质, 就有了下面的这个AnimatorProgressBar.

2023-04-01 20:13:01 186

原创 Android图片加载框架Glide使用总结

当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法。如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用。当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示。图片的缩放,centerCrop()和fitCenter()仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)使用Glide结合列表的样式进行图片加载。7) 显示本地视频。

2023-03-30 22:09:57 819

原创 深入flutter布局约束原理

1、flutter的widget分为,组合类、代理类和绘制类。2、Container是一个组合类,由DecoratedBox、ConstrainedBox、Transform、Padding、Align等绘制组件组合而成。3、flutter中有两种布局约束BoxConstraints盒约束和SliverConstraints线性约束。4、BoxConstraints的约束原理是:「向下传递约束,向上传递尺寸」。5、BoxConstraints的约束类型为:紧约束、松约束、无界约束、有界约束。

2023-03-30 18:58:15 262

原创 理性分析Window、Activity、DecorView以及ViewRoot之间关系

将DecorView建立起来,通过setContentView设置的界面,如何在onResume后对用户可见,需要从ActivityThread说起;重点看下handleResumeActivity(),在这其中,DecorView将会显示出来,同时重要的一个角色;ViewRoot也将登场;当我们执行了Activity.makeVisible()方法之后,界面才对我们是可见的;Activity和window,DecorView ,viewRoot是什么关系。今天我们就来讲解下,这样你在面试时候,游刃有余;

2023-03-29 13:43:43 372

原创 2023,7年的Android工程师告诉你怎么学习

不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大。最近看到很多Android新手问Android学习路线,学习方法啊,如何入门啊,所以我从网上找了一些资料,然后以我的工作经验给大家总结一下,让你们少走弯路,提取一些工作中经常用到的技术一、学习Android的心态。

2023-03-28 20:41:31 351

原创 字节二面:如何实现一个 System Services?

在 Context 里定义一个代表 wuxiaolong 服务的字符串 frameworks/base/core/java/android/content/Context.java。

2023-03-28 16:01:16 246

原创 Android开发最新面试题总结附答案(25个知识点600页)

如今安卓开发不像前几年那么热门,但是高级人才依然紧缺,大家看着这句话是不是很熟悉,因为 web 高级人才也紧缺,c++ 高级人才一样紧缺,那么到了人工智能时代,人工智能时代的高级人才也同样会紧缺!似乎是高级人才的人在其他领域也是高级人才,而不是因为选择了热门才会一帆风顺。

2023-03-27 20:40:25 398

原创 深入理解Android的startservice和bindservice

bindService是绑定Service服务,执行service服务中的逻辑流程。service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己。只要调用一次stopService()方法便可以停止服务,无论之前它被调用了多少次的启动服务方法。

2023-03-27 15:23:27 1136

原创 Android端使用200行代码实现的分页加载 --- PageHelper

在项目初期,为了统一管理列表的分页加载逻辑,于是写了一个BaseRvActivity/BaseRvFragment去实现。后来随着项目的不断庞大,渐渐地往里面增加了单选/多选,筛选条件配置等等其他的逻辑,甚至于还加入了一些业务相关的逻辑代码,并且还继承于这两个文件实现了几个扩展后的BaseXxActivity/BaseXxFragment,导致某些页面的Activity变成了BaseActivity的第N代子孙,继承关系就成了这样。这是我们想看到的吗?不,并不是。在这样的情境下,突然想到了最近在学习。

2023-03-26 22:22:24 531

原创 BroadcastReceiver插件化

这类广播发出后,所有感兴趣BroadcastReceiver会按照优先级先后收到该广播,需要注意的是,收到有序广播的BroadcastReceiver可以选择继续往下传,也可以选择中断该广播,也就是说优先级比它低的BroadcastReceiver都不会收到广播,有序广播发送比较简单。静态注册更常见的应用场景是应用未启动时接收系统广播,比如说手机开机完成的系统广播,手机刚开完机时,应用肯定还没有启动,这时候应用就可以通过静态广播来接收手机已经开机的系统广播,并执行相应的操作。广播按照不同标准可以分为几类。

2023-03-26 20:43:24 104

原创 Kotlin进阶-高阶函数进阶演变之路

以上就完成了一个DSL的改装,完美运行,当然这是接口有多个实现函数可以这么搞,如果接口只有一个函数我们可以选择直接使用高阶函数,或者使用SamType的方式定义都可以,完全就不需要这么麻烦的定义DSL了。可以看到其实高阶函数才是这些功能的基石,也是相比Java代码更方便的一个点,大家使用的时候一定要掌握的就是高阶函数这个点。多个函数就不能使用Sam的方式来修饰接口了,但是我们使用的是高阶函数类型,所以是可以直接使用{}的。可以实现一样的效果,只是使用回调的时候,一个是it 一个是this。

2023-03-25 22:13:00 268

原创 面试官:Kotlin 协程如何与 Java 进行混编?

Java靠语义约束。比如定义的函数名中 sync 修饰,表明他可能是一个耗时的函数,更好的还会添加注解,让 lint 帮助使用者去做一些检查,确保不会在主线程中去调用一些耗时函数导致页面卡顿。靠语法约束,定义 Callback。将耗时的函数执行放到一个单独的线程中执行,然后将回调的结果通过 Callback 的形式返回。这种方式无论调用者是什么水平,代码质量都不会有问题;Kotlin靠语义约束,同 Java。添加 suspend 修饰,靠语法约束。内部耗时函数切到子线程中执行。

2023-03-25 20:38:23 704

原创 如何使用Android Studio开发/调试Android源码

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.如果编译过,则无需再次编译)

2023-03-24 22:22:07 1093

原创 别再notifyDataSetChanged()了,使用DiffUtil让你的RecyclerView更加丝滑

先介绍一下MVVM我相信大家都已经非常熟悉了ViewModel负责提供数据给View,通常我们会观察ViewModel的数据变化,当接收到了新数据后就刷新UI。通常可能我们会这么写//在View层观察数据//提交数据给adapter 更新UI})//在Adapter中这么写= null假设data1 和data2是这样的效果大概是这样的我们可以看到,两个不同的数据有数据的移动,变化(大小写改变为变化),增加,删除但是这些变化并没有很明显的展示出来,只是很生硬的一个视图的变化。

2023-03-24 20:54:16 335

原创 Android屏幕刷新机制与Choreographer的工作原理

相信通过本次的分享,我们都可以对Android的页面刷新机制更加了解,同时也知道了平时没有直接接触到的Choreographer是怎么工作的。

2023-03-24 15:02:35 315

原创 Android 性能优化 之为什么要进行启动优化

其次有很多同学喜欢把那些优先级较低的任务进行延迟加载,比如new Handler().postDelayed(),这种我觉得是非常不可取的,假如说放在postDelayed中的任务耗时2s,延迟1s进行处理,那么在执行2s任务的过程中,有用户进行操作,那岂不是很卡吗,很明显,这是指标不治本的。但是从冷启动的启动流程中很多都是系统做的,我们没有办法操控。其次,网上也流行一种说法,就是8秒定律,意思是说,如果用户在打开一个页面,在8秒的时间内还没有打开,那么用户大概的会放弃掉,意味着一个用户的流失。

2023-03-23 20:01:59 156

原创 Android 之Preference控件

addPreference(Preference preference): 动态添加preference控件,通过PreferenceGroup对象动态添加preference;Preference是Android的控件之一,相对来说我们用的比较少,但在系统应用的Settings设置应用模块中大部分由Preference控件组成。getPreferenceScreen().removePreference() : 动态移除某个preference控件;android:layout: 设置自定义布局;

2023-03-23 14:10:38 882

原创 用AIDL完成可跨进程通信的WebView框架

至今为止做过的项目里,H5和android的通信都是一个个方法写好,用注解标识,然后互相调用,而且还都写在同一个地方,甚至有些没把WebView放到另一个进程中去,而且方法多了,显得特别臃肿和混乱。之前写过一个可跨进程的WebView框架,经过学习之后做出了改进。虽然还有很多可优化的点,这就算先记录下来吧。

2023-03-22 22:04:44 1006

原创 Android——自定义Dialog的两种常见方式

false

2023-03-22 20:30:01 2377

原创 [Android 学习笔记] Jetpack Compose 解析

可以看出Jetpack Compose面向组合实现UI树相较于传统View模式的灵活性。总的来说就是如下几点:1.子控件的每个modifier工作,进行测量,并且摆放(下一个modifier会在上一个的基础上进行测量摆放,这也是为什么modifier对顺序敏感)

2023-03-22 14:32:03 174

原创 总结2023Android开发面试题(含答案)

作者本人平时也收集了一些Android核心笔记知识点,面试题资源完整版,及自动化资源详细解析,有需要【点击这里作为一位过来人也是希望你们少走一些弯路。这些资料,对于做Android开发的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….祝大家都能拿到心动的offer~~点击这里。

2023-03-21 20:57:24 2017

原创 Android JectPack Compose原理解析

动态展示UI:在执行过程之中不断的变化UI,就需要不断的对其进行验证,并且确保其依赖关系。还要保证生命周期内的依赖满足情况。紧耦合:一处代码影响多处,并且大概率情况是隐式,看起来毫无关联,实际有影响命令式UI:在编写UI代码时,随时都要考虑如何转换到对应的状态单继承:是否可以通过其他方式实现突破单继承的限制?代码膨胀:随着业务的不断扩展,如何控制代码膨胀?

2023-03-21 15:32:30 420

原创 2023最新Android Flutter面试题,你值得拥有!

面试是我们进入一个公司的门槛,通过了面试才能进入公司,你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试,得到公司的认可呢?面试Flutter开发要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一下笔者近几年的面试总结!由于面试题较多,只放了两个部分的面试,答案也整理好了,有需要可以看文末~

2023-03-20 20:17:04 1508

原创 Framework运行环境之启动SystemServer进程

SystemServer进程在Android的运行环境中扮演了"中枢"的作用,在APK应用中能够直接交互的大部分系统服务都在这个进程中运行,例如WindowManagerServer(Wms)、ActivityManagerSystemServive(AMS)、PackageManagerServer(PMS)等常见的应用,这些系统服务都是以一个线程的方式存在与SystemServer进程之中。一旦配置好SystemServer的进程环境后,就从类SystemServer中main()函数开始运行。

2023-03-20 15:56:24 122

原创 最通俗移动的Android性能优化总结

这时候只需要在ReferenceQueue中去查找是否存在该对象,如果没有就执行一个GC,再次查找,如果还是没有,则说明该对象可能无法被回收,也就可能发生了内存泄漏,最后使用HAHA这个开源库取分析dump之后的heap内存。虚引用:对于对象来说,是无感的,如果只存在虚引用,GC的时候会直接被回收。虚引用的目的是为了追踪一个对象被回收的时机。Android的界面为每秒60帧,即必须在16ms内完成1帧的绘制,如果某个方法耗时过程,导致16ms内无法完成绘制,会导致丢帧,丢帧的多了,直观上感受就是界面卡顿。

2023-03-19 22:09:12 201

原创 2023最新Android App启动流程面试题总结

应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。SystemServer叫做系统服务进程,大部分Android提供的一些系统服务都运行在该进程中,包括AMS,WMS,PMS,这些系统的服务都是以一个线程的方式存在在SysyemServer进程中。最后,将其与未加密的摘要信息(MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被修改。

2023-03-19 20:59:43 914

原创 面试题:Android性能优化之崩溃优化+卡顿优化

通过移植底层获取logcat的实现,通过socket直接跟logd交互。优点:比较灵活,预先分配好资源,成功率也比较高。缺点:实现非常复杂卡顿,顾名思义就是用户体感界面不流畅。我们知道手机的屏幕画面是按照一定频率来刷新的,理论上讲,24 帧的画面更新就能让人眼感觉是连贯的。但是实际上,这个只是针对普通的视频而言。对于一些强交互或者较为敏感的场景来说,比如游戏,起码需要 60 帧,30 帧的游戏会让人感觉不适;位移或者大幅度动画 30 帧会有明显顿挫感;

2023-03-17 20:10:22 388

原创 写的Android代码不能复用?从MVC开始重新学习

Android项目架构发展了这么多年,MVC,MVP,MVVM,现在又出现了MVI。架构层出不穷,可我一致感觉自己用的不太对。MVP写的代码好像...和MVC写的差不多。用MVVM写的代码,emm 和之前的好像也差不多我发现自己有一个能力,网上所有号称可扩展,可复用,可维护,灵活易测试的架构。到了我手里都变得不可扩展,不可复用,不可维护,不灵活,没测试过。我一点都没有在含沙射影,只是觉得自己很牛逼🐶。

2023-03-17 15:21:18 161

原创 Framework面试题—谈谈你对Zygote的理解?

Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意,在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪些?下面我们通过以下几点来剖析这道问题!了解Zygote的作用熟悉Zygote的启动流程深刻理解Zygote的工作原理下面来我们来深入剖析,同时本文已收录到我的Github:里,里面还有更多问题解析整理,大家可以来进行参考学习!Zygote启动流程中需要主要以下2点问题Zygote fork要保证是单线程。

2023-03-16 21:12:15 112

原创 揭秘kotlin协程的实现原理

本文介绍了kotlin协程的实现思想,Continuation、CPS和suspend方法的实现,不只是kotlin协程,其他语言的协程的实现思想也是类似的,同时还介绍了kotlin提供的intrinsics方法,它是用于给用户操纵这些Continuation,最后通过intrinsics方法实现了一个简化版的kotlin协程,所以kotlin协程也没有那么神秘,它只是Continuation的应用,它只是在这些Continuation的基础上添加了生命周期管理、父子关系、异常处理、线程切换等逻辑。

2023-03-16 16:15:53 295

原创 Flutter 带你从不一样的角度实现LoadingMore(加载更多)

remainingPaintExtent : 可以简单的理解为还有多少 pixel 可以画(不一定对...但是保证,当你的 sliver 从底部滑出去了,这个值就为0)。precedingScrollExtent : 之前的Sliver一共消耗了多少滑动大小(对应下面的scrollExtent),可以用来判断Sliver是否充满 Viewport。viewportMainAxisExtent : 如其名。

2023-03-15 18:55:49 513 1

原创 一文搞懂Android中的MVC、MVP、MVVM架构 (附实现代码)

先来看一下MVC、MVP、MVVM的架构图。从这些架构图中,可以看到每种架构都有3个模块以及数据流动方向箭头。模块在系统架构中,首先要做的就是把系统整体按照一定的原则划分成模块。数据流动模块划分之后,模块之间的通信,就是数据的流动。在Android中,流动数据包括两部分,事件和数据。架构模块和模块之间的数据通信方式构成不同的架构。在这3种架构中,都是把系统整体划分成了3个模块:视图层,数据层,业务层。他们之间的区别在于,模块之间的通信方式(数据流动方向)不一致。

2023-03-15 14:51:19 1662 1

原创 让你易上手的Jetpack DataStore教程

Jetpack DataStore是一种数据存储解决方案,允许使用协议缓存区来存储key-value值或者序列化对象。谷歌的建议是如果当前使用的是SharedPreferences的话,可以考虑迁移到DataStore。DataStore一共有两种类型:Preferences DataStore和Proto DataStore。Preferences DataStore: 使用键存储和访问数据。此实现不需要预定义的架构,也不确保类型安全。

2023-03-14 18:54:38 360 1

空空如也

空空如也

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

TA关注的人

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