笔记
文章平均质量分 84
孟芳芳
再难的事,只要你开始做,就已经成功了一半!剩下的一半就是坚持和努力了!
展开
-
Android invalidate、requestLayout
invalidate()方法的使用,就是重新触发一次View的绘制流程。入口在View类中,public void invalidate() { invalidate(true);}public void invalidate(boolean invalidateCache) { invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true);}在 invalidateI...原创 2022-05-14 17:43:37 · 3882 阅读 · 0 评论 -
Android Activity启动流程○
从点击屏幕上的应用icon,到该应用展示第一个可视界面,这个过程中,Android系统究竟做了什么操作?又涉及到哪些进程?1.根Activity启动过程①从Launcher到AMS当点击屏幕上的应用icon时,Laucher发送启动应用的请求给AMS,因为Launcher是在Launcher进程,而AMS是在SystemServer进程。因此,实现这个请求,本质上是在实现一个跨进程通信的功能。在安卓领域实现跨进程通信的技术有多种,像是Broadcast、ContentProvinder等。在系.原创 2022-05-11 14:12:33 · 4356 阅读 · 0 评论 -
Android 坐标系相关
1.getLocationInWindow和getLocationOnScreen①一个控件在其父窗口中的坐标位置View.getLocationInWindow(int[] location)②一个控件在其整个屏幕上的坐标位置View.getLocationOnScreen(int[] location)getLocationInWindow是以B为原点的C的坐标getLocationOnScreen以A为原点。①getLocationOnScreen示例:st..原创 2022-05-09 20:32:24 · 667 阅读 · 0 评论 -
Android PopupWindow
1.PopupWindowPopupWindow类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。2.用法点击按钮弹出PopupWindow:private void showPopupWindow(View view) { //自定义布局,作为PopupWindow显示的内容 View contentView = LayoutInflater.from( mContext).inflate(R.layout.pop...原创 2022-05-08 00:15:50 · 2785 阅读 · 0 评论 -
Android ListView
1.ListviewListview是用来显示大量数据的控件,且不会因为展示大量数据而出现内存溢出的现象,其原因是相关缓存机制保证了内存的合理使用。首先看一下ListView的继承结构:ListView的继承结构还是很复杂的,它直接继承自AbsListView,而AbsListView有两个子实现类,一个是ListView,另一个就是GridView,从这一点就可以猜出来,ListView和GridView在工作原理和实现上都是有很多共同点的。然后AbsListView又继承自Adapter原创 2022-05-05 20:22:32 · 3023 阅读 · 0 评论 -
Android view.post★★★★
1.view.post()在开发过程中用到过几次view.post(),但是对它的原理不甚了解,今天就从源码看看它是怎么实现的吧。开始源码前,先提几个问题,带着问题去看源码应该会比较有效率。①为什么View.post()是可以对UI进行操作的呢,即使在子线程中调用 View.post()?②View.post()执行时,View的宽高已经计算完毕,所以经常看见在Activity的onCreate()里调用View.post()来解决获取View宽高为0的问题,为什么可以这样做呢?③用 V原创 2022-05-03 11:14:02 · 2921 阅读 · 0 评论 -
Android Fragment★★
1.Fragmentfragment译为“碎片”,是Android 3.0(API 11)提出的,最开始是为了适配大屏的平板。Fragment看起来和Activity一样,是一个用户界面。可以结合多个Fragments到一个activity中,来构建一个有多方面功能的UI,还可以重用同一个Fragment在多个activities中。Fragment可以当成是activity的一个组件,每个Fragment有单独的生命周期,可以在activity运行时进行添加和移除Fragment。因此,相比较于a原创 2022-04-26 13:54:57 · 11602 阅读 · 0 评论 -
Android overridePendingTransition
1.overridePendingTransitionAndroid在开发过程中,两个Activity切换需要设置动画效果时,在Android 2.0 之后可以使用overridePendingTransition方法。Activity的切换包括从一个Activity跳转到一个新的Activity或者退出当前Activity回到原来的Activity,所以存在两种动画:一种是Activity退出时的动画,一种是Activity进入时的动画。overridePendingTransition(in原创 2022-04-19 12:23:31 · 3452 阅读 · 0 评论 -
Android LayoutTransition
1.LayoutTransitionLayoutTransition意思是布局过渡,也就是布局动画,这个类可以实现ViewGroup的布局改变时自动执行动画。在Android开发时经常会用到View的setVisiblity()方法来动态隐藏和显示view,但是这样是没有过渡动画的,变化的时候会显得很生硬。LayoutTransition 从api11开始提供,主要功能就是在ViewGroup的布局发生变化时能够自动创建动画。使用的时候需要创建一个LayoutTransition实例,并调用Vi原创 2022-04-16 13:12:19 · 2896 阅读 · 0 评论 -
Android Transition
1.ActivityOptions在ActivityOptions出现之前,Activity的过度动画通常都是使用overridePendingTransition( enterAnim, exitAnim);来实现的。现在google提供了一种新的Activity的过度动画,就是ActivityOptions,并且提供了兼容包ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了几个方法:①ActivityOptionsCompat.make原创 2022-04-14 13:28:33 · 2832 阅读 · 1 评论 -
Android Animation★★★★
1.Android动画Android系统的动画主要分为三大类:①View Animation 视图动画:在古老的Android版本系统中就已经提供了,只能被用来设置View的动画。②Drawable Animation (也叫Frame动画、帧动画):专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。③Property Animation属性动画:只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包.原创 2022-04-12 15:56:36 · 1436 阅读 · 0 评论 -
Android ViewPager用法
1.ViewPager预加载ViewPager控件有个特有的预加载机制,即默认情况下当前页面左右两侧的1个页面会被加载,以方便用户滑动切换到相邻的界面时,可以更加顺畅的显示出来。通过ViewPager的setOffscreenPageLimit(int limit)方法可以设置预加载页面数量,当前页面相邻的limit个页面会被预加载进内存,默认的预加载个数limit为1。如果把limit设置为0 ,是不是就没有预加载了呢?答案是否定的,limit设置为0依然会预加载 ,可以看ViewPager.原创 2022-04-08 20:36:29 · 9388 阅读 · 0 评论 -
Android ViewPager源码★★★★★
1.ViewPagerViewPager是一个允许用户左右翻转数据页的布局管理器。ViewPager继承自ViewGroup:public class ViewPager extends ViewGroup {}2.ItemInfo先看ViewPager的一个内部类ItemInfo,它包含了一个页面的基本信息,在调用Adapter的instantiateItem方法时,在ViewPager内部就会创建这个类的对象,但它不包含view,结构如下:static class Item.原创 2022-04-07 17:55:40 · 1823 阅读 · 0 评论 -
Android ArrayList★
1.ArrayListArrayList的数据结构:容量:CAPACITY ; 实际大小:size;ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据。我们对ArrayList类的实例的所有的操作底层都是基于数组的。2.ArrayList源码解析(JDK1.8)ArrayList底层是Object类型的数组elementData和数组的有效长度size。//存放元素的数组transient Object[] elementDat.原创 2022-04-06 17:26:21 · 4325 阅读 · 0 评论 -
Android LinkedList★★
1. LinkedList①LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的。②LinkedList 实现 List 接口,能对它进行队列操作;实现 Deque 接口,即能将LinkedList当作双端队列使用;实现了Cloneable接口,即覆盖了函数clone(),能克隆;实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。③LinkedList 是非同步的。2.LinkedList.原创 2022-04-05 16:34:42 · 1033 阅读 · 0 评论 -
Android Vector★★
1.VectorVector和ArrayList很相似,其内部都是通过一个容量能够动态增长的数组来实现的。不同点是Vector是线程安全的。因为其内部有很多同步代码块来保证线程安全。Vector可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删除操作。Vector有交给重要属性:protected Object[ ] elementData; //底层数组protected i原创 2022-04-05 00:03:03 · 2304 阅读 · 0 评论 -
Android 集合
1.集合数组和集合都是对多个数据进行存储操作的。称为容器。这里的存储指的是内存层面的存储,而不是持久化存储。先看一下数组的缺点:①数组一旦指定了长度,那么长度就被确定了,不能更改。②数组一旦声明了类型以后,数组中只能存放这个类型的数据。即数组中只能存放同一种类型的数据。③在数组中删除、增加元素时,效率低,需要大量移动其他元素。④数组中实例元素的数量是没有办法获取的,没有提供对应的方法或者属性获取。比如创建一个数组时指定了数组长度为6,然后在下标为0和1的位置放入了元素。这时候原创 2022-04-04 15:46:53 · 1310 阅读 · 0 评论 -
Android setContentView★★★★
1.setContentView源码每天都在用的setContentView,你真的了解它吗?一起看看它的源码实现吧!//set the activity content from a layout resource.the resource will be inflated,adding all top-level views to the activity.//public void setContentView(View view) { getWindow().setConten..原创 2022-04-03 10:23:50 · 1763 阅读 · 0 评论 -
Android 面试—自定义ViewGroup默认不执行onDraw 0
1.问题在自定义ViewGroup中重写onDraw()方法,并且在onDraw中绘制了画面,但是运行过后,画面没有效果。随后自己写了一个简单的Demo,打出日志看了一下绘制流程,如下:从上面的图片可以清楚的发现在绘制时,只是走了onMeasure,onLayout和dispatchDraw,onDraw方法却没有调用。2.解决办法随后借鉴了网上的说法,在自定义ViewGroup的xml中设置了一个背景颜色,并运行打印log这个时候就可以看见在dispatchDraw之...原创 2022-04-02 12:05:18 · 1215 阅读 · 0 评论 -
Android SharedPreferences★★★★
1.SharedPreferences在Android中,我们通常会需要存储一些数据,有一些大型的数据诸如图片、JSON数据等,可以通过读写File的方式实现;有一些大量级的关系型数据,可以通过数据库SQLite实现;还有一些简单的、无安全风险的键值对数据,可以通过Android提供的SharedPreferences实现。SharedPreferences是一个轻量级的xml键值对文件,使用起来也是很方便。//根据文件名,获取SharedPreferences对象;mode一般都使用MO.原创 2022-04-01 23:15:00 · 1245 阅读 · 0 评论 -
Android Exception处理
异常发生时,如果没有一个异常处理器来处理这个异常,程序会被中止。在 JVM 当中有一个预先定义好的异常处理层次结构。结构中的第一层是 catch 块。try { crashyCode()} catch (e: IllegalStateException) { // 处理 IllegalStateException} catch (e: HTTPException) { // 处理 HTTPException}如果第一个 catch 块无法处理这个异常,异...原创 2022-03-31 20:28:25 · 1318 阅读 · 0 评论 -
Android 文字绘制”基线”★★★
1.文字基线文字“基线”就如同是我们的英语写字用的“四线本” ,实际上我们正式写字的时候为了整洁,都是有一条线的。在canvas在利用drawText绘制文字时,也是有规则的,这个规则就是基线:给文字定了一条基准线,通过Paint.FontMetricsInt获取的top和bottom值就与基线有关。FontMetrics 基线上面的值为负数,基线下面的值为正数。可见基线就是四线格中的第三条线!也就是说,只要基线的位置定了,那文字的位置必然是定了的!在我的手机上 top...原创 2022-03-30 14:46:44 · 2779 阅读 · 0 评论 -
Android 面试—ScrollView嵌套ListView会显示不全
1.问题scrollView嵌套ListView会导致ListView只显示一行item的高度,显示不全。2.原因通过查看源码发现:ScrollView和ListView的heightMeasureSpec都是MeasureSpec.UNSPECIFIED@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSp...原创 2022-03-30 00:31:40 · 1316 阅读 · 1 评论 -
Android Future
FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。Future用来获取异步计算的结果,即是获取Callable任务的结果。FutureTask有下面几个重要的方法:1.get()阻塞一直等待执行完原创 2022-03-29 21:21:04 · 1042 阅读 · 0 评论 -
Android WorkManager★★★
1.WorkManager在Google发布的Android Jetpack架构中,有一个专门用于安排和管理后台任务的库WorkManager 。WorkManager会考虑到操作系统电池优化功能(如Doze,待机等)的限制,在任何情况下(包括启动它的应用已经退出,甚至设备重启)仍然承诺保证执行工作,并且它有自己的数据库来维护任务。此外,很容易计划、取消和管理多个工作顺序和平行的执行。下图是一张其总的架构图:整个WorkManager的执行流程如下图所示:① 给WorkManager原创 2022-03-28 11:42:18 · 2713 阅读 · 0 评论 -
Android 并发编程CAS
1.CAS(比较并且交换)什么是原子操作?如何实现原子操作?假定有两个操作A和B(A和B可能都很复杂),如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。实现原子操作可以使用锁,锁机制满足基本的需求是没有问题的了,但是有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制,synchronized关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁。这里会有些问题:首原创 2022-03-27 13:54:46 · 262 阅读 · 0 评论 -
Android 并发编程ConcurrentLinkedQueue
实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现。1.ConcurrentLinkedQueue的结构首先看一下源码,从中你可以发现,它就是个队列的数据结构。private static class Node<E> { volatile E item; vola...原创 2022-03-26 22:47:31 · 2797 阅读 · 0 评论 -
Android 滑动冲突拦截法★
分别使用外部拦截、内部拦截方法解决SwipeRefreshLayout+ViewPager事件冲突问题,主要冲突为SwipeRefreshLayout是纵向滑动,而ViewPager是横向滑动。虽然本身源码已经做好了相应的处理,为了巩固事件分发的原理,我们通过自定义代码的方法解决。期望效果:横向滑动ViewPager,纵向滑动SwipeRefreshLayout1.内部拦截法内部拦截法是指父容器不拦截任何触摸事件,所有的触摸事件都传递给子元素,如果子元素需要此触摸事件就直接消耗掉,否者就交由.原创 2022-03-24 21:15:29 · 2498 阅读 · 0 评论 -
Android Iterator迭代器
1.IteratorIterator迭代器是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。Iterator为一个接口,它只提供了迭代了基本规则,在JDK中是这样定义的:对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:①迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。②方法名称得到了改进。其原创 2022-03-23 20:14:18 · 1149 阅读 · 0 评论 -
Android apk打包流程★
1.apk打包通常情况下,在开发过程中打包APK是一件很简单的事,主要可以通过两种方式:①用Eclipse或者Android Studio集成开发环境直接生成APK;②使用Ant工具在命令行方式下打包APK。不过不管哪种方式,打包APK的本质过程都是一样的。APK文件: 其实就是一个压缩包,当你解压以后会发现它内部主要就是资源文件和classes.dex,这个classes.dex就是Android系统Dalvik虚拟机的可执行文件。APK打包的流程图:2.打包流程①打包资.原创 2022-03-22 22:27:55 · 11765 阅读 · 0 评论 -
Android HashSet
1.HashSet此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此 set 进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容原创 2022-03-21 23:03:23 · 911 阅读 · 0 评论 -
Android JMM8大原子操作
1.java内存模型的8大原子操作Java内存模型(Java Memory Model, JMM)的8大原子操作:①lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。②unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量 才可以被其他线程锁定。③read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。④load(载入):作用于工作内存的变量,它把read操作从主内存中原创 2022-03-20 16:57:46 · 1718 阅读 · 0 评论 -
Android SparseArray★★
1.SparseArray特点SparseArray是Android中特有的数据结构,他的几个重要的特点:①以键值对形式进行存储,基于分查找,因此查找的时间复杂度为0(LogN);②由于SparseArray中Key存储的是数组形式,因此可以直接以int作为Key,避免了HashMap的装箱拆箱操作,性能更高,且int的存储开销远远小于Integer;③采用了延迟删除的机制(针对数组的删除扩容开销大的问题的优化) ;2.SparseArray重要属性public class S.原创 2022-03-19 12:06:18 · 2537 阅读 · 0 评论 -
Android HashTable
1.HashTableHashTable和HashMap一样是一个散列链表,它的容器是一个数组,而每一个数组中的元素都是一个单向的链表。它是Map的一个同步的实现,不支持空key的情况。2.基本参数DEFAULT_INITIAL_CAPACITY:默认容量DEFAULT_LOAD_FACTOR:默认的负载因子,表示散列链表的使用度,数越大那么使用度越高。entry:链表对象table:链表的容器是一个数组threshold:临界点,当达到这个临界点的时候进行扩容,它等于负载.原创 2022-03-18 20:29:25 · 1558 阅读 · 0 评论 -
Android 等待唤醒机制
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。void notify(): 唤醒一个正在等待该对象的线程。void notifyAll(): 唤醒所有正在等待该对象的线程。两者的最大区别在于:notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象n原创 2022-03-17 23:34:21 · 2287 阅读 · 0 评论 -
Android ConcurrentHashMap
1.ConcurrentHashMap无论是 1.7 还是 1.8 其实都能看出 JDK 没有对HashMap做任何的同步操作,所以并发会出问题,甚至 1.7 中出现死循环导致系统不可用(1.8 已经修复死循环问题)。因此 JDK 推出了专项专用的 ConcurrentHashMap ,该类位于 java.util.concurrent 包下,专门用于解决并发问题。ConcurrentHashMap 同样也分为 1.7 、1.8 版,两者在实现上略有不同。2.Base 1.7先来看.原创 2022-03-16 13:48:52 · 1727 阅读 · 0 评论 -
Android JUC — AQS+锁
1.synchronizedsynchronized用于多线程访问,并且被修饰的部分不能同时被执行,是代码同步的一种方式。①使用synchronized修饰方法(1)synchronized修饰方法原理过程:当多个线程同时访问被synchronized修饰的方法是,有且仅有一个线程可以被访问,当一个线程在访问时,其它线程只能等待。当一个线程访问完毕后,下一个线程才可以访问。原理:当方法被synchronized修饰后,如果想要执行该方法就必须获得相应的锁。每个类有且仅有一个锁(针对静态方原创 2022-03-15 22:23:14 · 4064 阅读 · 0 评论 -
Android Lambda表达式
1.Lambda表达式Java 8 引入的 Lambda 表达式的主要作用就是简化部分匿名内部类的写法。能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。Lambda 表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指明。2.Lambda表达式的用法①无参函数的简写无参函数就是没有参数的函数,例如 Runnable 接口的 run 方法,其定义如下:@F.原创 2022-03-14 20:18:16 · 937 阅读 · 1 评论 -
Android canvas
1.CanvasCanvas是一个画布,可以在这个画布上进行各种绘图操作。在Android中,想要获得一个Canvas对象主要有三种方法:①继承一个View,并重写onDraw()方法。View的Canvas对象会被当做参数传递过来,在这个Canvas上进行的操作会直接反映在View中。②调用SurfaceHolder.lockCanvas()返回一个Canvas对象。③通过构造方法自己创建一个Canvas对象。Bitmap bitmap = Bitmap.createBitmap(1原创 2022-03-13 14:17:53 · 11198 阅读 · 4 评论 -
Android Handler内存泄露和不会ANR原因
1.Handler引发内存泄露当不再需要某个实例后,这个对象却仍然被引用,防止被垃圾回收(Prevent from being bargage collected),这个情况就叫做内存泄露(Memory Leak)。看如下的代码:public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public vo...原创 2022-03-12 10:51:19 · 1984 阅读 · 0 评论