- 博客(50)
- 收藏
- 关注
原创 【Android】View的工作流程
measure流程分为View的measure流程和ViewGroup的measure流程。其中,ViewGroup的measure流程除完成自身测量外,还需遍历调用子元素的measure()方法。
2024-12-15 21:49:41
927
原创 【Android】Arouter的使用
我们可以看到唯独通过 Parcelable 方式序列化的对象没有使用SerializationService进行解析,而是直接从Bundle去取,但我们并不是通过withParcelable方法去设置的值,因此取得的数据为null。:因此,为了方便我们的操作,没有序列化和使用 Serializable 序列化的对象使用 withObject 方法传递,使用 Parcelable 方式序列化的对象则采用 withParcelable 方法进行传递。1、拦截器使用很奇特,只要在你代码里写上这个类,就起作用了。
2024-12-08 21:33:07
1066
原创 【Android】组件化嘻嘻嘻gradle耶耶耶
简单来说就是对 Gradle 的一层封装。为什么需要再封装一层呢?确保版本一致性: 让团队成员都使用项目指定的相同版本进行构建,避免因版本差异导致的构建问题方便项目迁移和共享:当项目需要迁移到其他环境或与他人共享时,不需要担心 Gradle 版本的问题,因为 Wrapper 会处理好版本的适配。版本更新管理:项目可以方便地更新 Gradle 版本,只需在 Wrapper 的配置中修改版本号,所有使用 Wrapper 的开发者在下次构建时都会自动获取并使用新的版本。
2024-12-01 22:07:04
907
原创 【Andorid】EventBus浅探
订阅者(Subscriber)把自己想订阅的事件(Event)注册(register)到调度中心(EventBus),当发布者(Publisher)发布该事件到调度中心时,也就是该事件触发时,由调度中心统一调度订阅者注册到调度中心的处理代码(onEvent())。(发布/订阅者模式与观察者模式并不完全一样)粘性事件的特点在于能够在发送事件之后再进行订阅,依然可以接收到该事件。这与普通事件不同,普通事件遵循先注册订阅者后发布事件的顺序,而粘性事件允许先发布后注册的操作方式。
2024-11-18 22:42:16
645
原创 【Android】BottomNavigationView使用的一些小记忆
然后,在menu目录下定义 tab 的菜单,例如接着添加到布局中指定tab 显示菜单;和对应为指定 tab 的 icon 和文本颜色(通过定义 color ,指定不同选中状态的颜色)。最后在 对应的 activity 中对添加 item 选中监听,配合ViewPager实现界面切换,或者使用fragment这段代码是在使用Android Jetpack的Navigation组件来设置一个带有的导航。这行代码通过方法获取布局文件中定义的的实例,并将其存储在变量navView中。这行代码创建了一个。
2024-11-17 22:24:22
872
原创 【Android】名不符实的Window类
FEATURE_开头的属性凡是以 FEATURE_ 开头的静态常量都是定义当前窗口具有什么特性(比如界面是带有标题栏呢,还是节目带有action bar)FEATURE_OPTIONS_PANEL:代表创建action bar的menuFEATURE_NO_TITLE:代表不显示标题栏FEATURE_PROGRESS:如果显示标题栏,则标题栏中显示进度条FEATURE_LEFT_ICON:如果显示标题栏,则标题栏显示左iconFEATURE_CUSTOM_TITLE:代表自定义标题栏。
2024-11-08 23:02:35
1295
原创 【Android】Activity数据恢复保存
在一些特殊的情况下,比如手机处于低内存的时候,系统会按优先级以及app所处于后台的状态(app处于后台主要可分为:失去焦点后台和不可见后台)把一些app杀掉来释放内存。这些app被杀掉了,但是这些app中的某一个或某些是有可能被用户再次打开的,,系统就提供了Activity界面状态保存恢复的功能:app可以把自己需要保存的数据交给系统进程进行暂时存储。
2024-11-03 21:13:20
716
原创 【Android】基础回顾--四大组件
继承至BroadcastReceiver基类重写onReceiver()方法广播接收器收到相应广播后,会自动回调onReceiver()方法;一般情况下,onReceiver方法会涉及与其他组件之间的交互,如发送Notification、启动service等等;默认情况下,广播接收器运行在UI线程,因此onReceiver方法不能执行耗时操作,否则可能ANR。
2024-10-27 23:14:18
2963
原创 【Android】事件分发机制
从上表可以看到 Activity和 View都是没有事件拦截的,这是因为:Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕都无法响应事件,这肯定不是我们想要的效果。View作为事件传递的最末端,要么消费掉事件,要么不处理进行回传,根本没必要进行事件拦截。
2024-10-19 20:44:35
1204
原创 Activity的生命周期分析
关于这个问题,我们的确不大可能把所有版本的源码都分析一遍,但是作为Android运行过程的基本机制,随着版本的更新并不会有大的调整,因为Android系统也需要兼容性,不能说在不同版本上同一个运行机制有着截然不同的表现。根据上面的分析,我们知道,这两个配对的回调分别表示不同的意义,onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别。
2024-09-29 23:03:55
945
原创 【Android】 IconFont的使用
IconFont虽然看起来是图标,实际原理跟字体的实现方式是一样的,所以我们把每个Icon当作一个特殊的文字来理解和处理。:SVG 使用基于路径的矢量图形,这意味着图形可以无限放大而不失真,非常适合需要多种分辨率的应用。:SVG 文件是文本格式,可以使用任何文本编辑器创建和编辑。:SVG 可以包含交互性,如事件处理器,允许用户与图形进行交互。:SVG 文件的大小通常比位图小,这使得它们在网页上加载更快。:SVG 支持 CSS 样式,可以方便地改变图形的外观。前几步如之前的,在平台获取字体文件压缩包。
2024-09-22 22:10:07
806
原创 【Android】ViewPager
ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view,用于允许用户在几个页面(或称为碎片)之间左右滑动切换。它通常用于创建像画廊或轮播图那样的用户体验。1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。
2024-09-13 23:43:05
2173
原创 【Android】Mvp架构初探
作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。有一点还需要注意,presenter是双向绑定的关系,因此,在设计的时候就要注意接口和抽象的使用,尽可能的降低代码的耦合度,这也是mvp的宗旨。对未变化数据的不必要的频繁访问,也将损害操作性能。
2024-09-08 20:54:51
840
原创 【Android】最好用的网络库:Retrofit
Retrofit是一款由Square公司开发的网络库,但是它和OkHttp的定位完全不同。OkHttp侧重的是底层通信的实现,而Retrofit侧重的是上层接口的封装。事实上,Retrofit就是Square公司在OkHttp的基础上进一步开发出来的应用层网络通信库,使得我们可以用更加面向对象的思维进行网络操作。Retrofit的项目主页地址是:https://github.com/square/retrofit。Retrofit的设计基于以下几个事实。
2024-08-30 22:08:13
2101
原创 【Android】通知的使用
通知(notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。
2024-08-04 16:46:39
2862
1
原创 【Android】多媒体使用
xml文件main首先这里创建了一个File对象,用于存放摄像头拍下的图片,这里我们把图片命名为output_image.jpg,并存放在手机SD卡的应用关联缓存目录下。什么叫作应用关联缓存目录呢?就是指SD卡中专门用于存放当前应用缓存数据的位置,调用getExternalCacheDir()方法可以得到这个目录,具体的路径是/sdcard/Android/data//cache。那么为什么要使用应用关联缓存目录来存放图片呢?
2024-08-04 16:42:41
1051
原创 【Android】ContentProvider基本概念
这是之前所学的东西,应用这个防止系统阻止我们监听开机广播其实用户主要在两个方面得到了保护。一方面,如果用户在低于Android 6.0系统的设备上安装该程序,会在安装界面给出提醒。这样用户就可以清楚地知晓该程序一共申请了哪些权限,从而决定是否要安装这个程序。另一方面,用户可以随时在应用程序管理界面查看任意一个程序的权限申请情况,这样该程序申请的所有权限就尽收眼底,什么都瞒不过用户的眼睛,以此保证应用程序不会出现各种滥用权限的情况。在Android 6.0系统中加入了运行时权限功能。
2024-08-04 16:36:09
1068
原创 【Android】持久化技术简介
数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态之间进行转换。持久化技术被广泛应用于各种程序设计领域,而本节要探讨的自然是Android中的数据持久化技术。
2024-07-28 18:52:41
1636
原创 【Android】系统广播
这是因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。Android提供了一套完整的API,允许应用程序自由地发送和接收广播。发送广播的方法其实之前稍微提到过,如果你记性好的话,可能还会有印象,就是借助我们第3章学过的Intent。而接收广播的方法则需要引入一个新的概念——BroadcastReceiver。
2024-07-28 14:09:44
1003
原创 【Android】Fragment基本使用
Fragment是一种可以嵌入在Activity当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛。
2024-07-28 13:59:05
1514
原创 【Android】Activity的生命周期
Activity的生命周期1.返回栈其实Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前一个入栈的Activity就会重新处于栈顶的位置。系统总是会显示处于
2024-07-20 17:05:18
2048
原创 【Android】系统框架-第一行代码启程!
Google为Android平台专门设计的一套虚拟机来运行Android应用程序,那就是Dalvik虚拟机(Dalvik Virtual Machine,DVM)。注意:尽管Android应用程序是通过Java语言来开发的,但其并不是运行在标准的Java虚拟机上。DalVik虚拟机作为Android平台的核心组件,拥有如下特点: 1. 体积小,占用内存空间小;2. 执行专有的DEX(Dalvik Executable)文件格式,体积更小,执行速度更快;
2024-07-20 16:03:20
1941
原创 【Android】 dp与sp,加冕为王
DPI 是一个物理度量,表示每英寸长度内可以显示的像素点数。一个较高的 DPI 值意味着屏幕每英寸可以显示更多的像素,从而提供更清晰、更细腻的显示效果。DPI 的单位通常是像素/英寸(PPI,即 Pixels Per Inch)。在Android中,DPI 用于区分不同屏幕密度的设备。Android系统根据设备的DPI值将屏幕分为几个不同的类别,以便为不同的屏幕提供适当的资源和布局。
2024-07-19 22:06:15
2316
1
原创 均衡!均衡!二叉搜索树!!
我偷偷拿走金色的砝码,为激起的涟漪洋洋得意;祂总能看穿我的诡计,星星又将游码归零。——阿德里安•斯宾塞—史密斯,《有关星空的寓言集》
2024-06-16 16:59:11
870
原创 反射学习记
动态代理:当想要给实现了某个接口的类中的方法,加⼀些额外的处理。创建⼀个代理,故名思议就是创建⼀个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了。3)内部暴露:由于反射允许代码执行⼀些在正常情况下不被允许的操作(⽐如:访问私有的属性和⽅法),所。这个代理类并不是定义好的,是动态生成的。反射可以提供运⾏时的类信息,并且这个类可以在运⾏时才加载进来,甚至在编译时期该类的。应⽤举例:⼯⼚模式,使用反射机制,根据全限定类名获得某个类的 Class。对象的加载,类在第⼀次使用时才动态加载到。
2024-06-10 16:34:34
294
原创 泛型aaaaa
有很多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。泛型的思想很早就存在,如C++中的模板(Templates)。参数化类型泛型的本质就是"参数化类型"。一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。
2024-05-30 22:58:22
1000
3
原创 集合框框框地架
CollectionSetSetTreeSet:基于红⿊树实现,⽀持有序性操作,例如:根据⼀个范围查找元素的操作。但是查找效率不如HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。HashSet:基于哈希表实现,⽀持快速查找,但不⽀持有序性操作。并且失去了元素的插⼊顺序信息,也就是说使⽤ Iterator 遍历 HashSet 得到的结果是不确定的。LinkedHashSet:具有 HashSet 的查找效率,且内部使⽤双向链表维护元素的插⼊顺序。
2024-05-24 22:51:15
771
原创 单单单单单身の刁队列
单调队列是一种强大的数据结构,它在处理与窗口相关的算法问题时特别有用。通过维护队列的单调性,我们可以有效地减少不必要的计算,提高算法的效率。希望这篇博客能够帮助您更好地理解单调队列以及如何在Java中实现和应用它。如果您有任何问题或想要了解更多信息,请在评论区告诉我。
2024-05-09 22:18:30
1096
原创 super和this使用方法
如果父类中定义了有参构造器但没有显示写出无参构造器,那么必须通过super调用父类的有参构造函数,如果父类中定义了多个有参构造区,那么用super调用其中一个有参构造器即可。父类如果重写了无参构造器或者父类中没有有参构造器,那么子类的构造方法第一行就是super(),可以省略。this概述:代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)如果一个类没有基础任何父类super相当于调用的是Object中的方法。子类重写父类的方法后可以通过super调用到父类的方法。
2024-05-05 14:50:38
520
原创 并并并并·病查坤
引用自百度百科:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。简单来说,并查集是一种以树形结构来表示不同种类数据的集合。一般当我们需要用到数据的连通性时会用到它。
2024-04-26 22:29:18
1083
2
原创 单调栈和单调队列所学的一些问题
单调栈中的元素要求从栈底到栈顶单调递增遍历数组,如果元素入栈后符合单调要求则顺利入栈不符合要求则弹出栈顶元素,元素出栈时得出结果右侧结果:待入栈元素左侧结果:出栈后的栈顶元素单调栈主要用来求每一个当前数左右最近的比他小/大的数,复杂度O(N),单调栈分为:单调递增栈:从栈底(封闭端)到栈顶(开口端)元素从大到小(递减)单调递减栈:从栈底(封闭端)到栈顶(开口端)元素从小到大(递增)
2024-04-14 18:52:12
733
1
原创 小小总结之二分查找三种情况
那么当右边界收缩的时候,mid的结果大于目标,所以就保证了这个数据一定大于等于我们目标值,插入的时候就需要插入到这里。我们在这里,返回的是平方根,所以我们直接让mid的积
2024-04-06 19:23:08
1041
1
原创 单例设计模式
单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的ServletContext 、ServletContextConfig 等、Spring框架应用中的。特点:构造方法私有,提供一个全局访问点。实现方式:有很多,1.饿汉式 2.懒汉式 3.注册式 4.ThreadLocal优点:内存中只有一个实例,减少内存开销;避免对资源多重占用;
2024-03-30 21:37:48
933
1
原创 初步java学习的几个问题
面向对象是一种基于面向过程的编程思想,是向现实世界模型的自然延伸,这是一种"万物皆对象"的编程思想。由执行者变为指挥者,在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动。区别:(1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。(2)封装性: 都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
2024-03-24 17:25:58
956
1
原创 git从底层逻辑开始的探索之路
git 操作指令本身并不复杂,翻来覆去就是几个常用指令,我们反复使用做到孰能生巧就可以了,为什么还要去深究其底层实现原理呢?放到 git 的学习使用上来说,如果我们不了解 git 底层存储原理,只是死记硬背操作指令的话,其实只能形成一些表层的肌肉记忆并不能做到融会贯通,容易出现了学了又忘,忘了又学,学了又忘的问题.但是倘若掌握了原理就完全不同了,哪怕一个知识点对应结论忘了也完全不慌,大不了我们基于原理机制,从起点出发重新推导一轮即可理工科的魅力不就在此吗?文科。
2024-03-15 22:09:23
1258
1
原创 git 初次探索
暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。前面已经提到了我们的工作区是用来存放代码的,所以新增的文件也是在工作区生成,此时在工作区新增一个111.txt文件。1.git reset --hard [commit Id](修改工作区,修改暂存区)2.git reset --soft [commit Id](保留工作区,保留暂存区)工作区:包含.git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码。工作目录(工作区),暂存区,版本库。
2024-03-10 19:09:17
796
1
原创 再修传奇之转圈圈——循环链表
将单链表中终端结点的指针端由空指针改为头结点,就使整个单链表形成了一个环,这种头尾相接的单链表称为循环链表。简单理解就是形成一个闭合的环,在环内寻找自己需要的结点。在循环单链表中附设尾指针有时比附设头指针会使操作变得更简单。int data;} Node;
2023-12-10 18:01:59
888
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人