![](https://img-blog.csdnimg.cn/20200530103043461.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android开发
通过《Android开发艺术》这本书进行学习,一些学习心得和体会
金栗
这个作者很懒,什么都没留下…
展开
-
1.Android多进程模式的运行机制
大部分人认为开启多进程是很简单的事情,只需要给四大组件指定android:process属性即可。比如说在实际的产品开发中,可能会有多进程的需求,需要把某些组件放在单独的进程中去运行,很简单吗?然后迅速给那些组件指定了android:process属性,然后编译运行,发现“正常地运行起来了”。真的如此吗?先举个例子,SecondActivity通过指定android:process属性从而使其运行在一个独立的进程中,新建一个类,UserManager,这个类中有一个public的静态成员变量,如下所示:原创 2020-05-30 11:16:19 · 308 阅读 · 0 评论 -
图解Android图片三级缓存
在Android开发中,如果图片过多,而我们又没有对图片进行有效的缓存,就很容易导致OOM(Out Of Memory)错误。因此,图片的缓存是非常重要的,尤其是对图片非常多的应用。现在很多框架都做了很好的图片缓存处理,如Fresco、Glide等。内存缓存,读取速度最快。硬盘缓存(文件缓存),读取速度比内存缓存稍慢。网络缓存,读取速度最慢。其中内存缓存和硬盘缓存对应的类分别是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache缓存类,其中维护着原创 2021-06-23 10:16:08 · 204 阅读 · 0 评论 -
MeasureSpec和LayoutParams的对应关系
系统内部是通过MeasureSpec来进行View的测量,但是正常情况下我们使用View指定MeasureSpec,尽管如此,但是我们可以给View设置LayoutParams。在View测量的时候,系统会将LayoutParams在父容器的约束下转换成对应的MeasureSpec,然后再根据这个MeasureSpec来确定View测量后的宽/高。需要注意的是,MeasureSpec不是唯一由LayoutParams决定的,LayoutParams需要和父容器一起才能决定View的MeasureSpec,从原创 2020-09-10 10:35:43 · 454 阅读 · 0 评论 -
View的工作原理---深入理解MeasureSpec
为了更好理解View的测量过程,我们还需要理解MeasureSpec,从名字上来看,MeasureSpec看起来像“测量规格”或者“测量说明书”,不管怎么翻译,它看起来都好像是或多或少地决定了View的测量过程。通过源码可以发现,MeasureSpec的确参与了View的measure过程。MeasureSpec是干什么的呢?它在很大程度上决定了一个View的尺寸规格,之所以是很大程度上是因为这个过程还受父容器的影响,因为父容器影响View的MeasureSpec的创建过程。在测量过程中,系统会将View的原创 2020-09-01 16:31:17 · 165 阅读 · 0 评论 -
View的工作原理---ViewRoot和DecorView基本概念
ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联,这个过程可参看如下源码:root = new ViewRootImpl(view.getContext(),display);r原创 2020-08-24 14:43:09 · 466 阅读 · 0 评论 -
View的滑动冲突---滑动冲突的解决方式
首先我们要分析第一种滑动冲突场景,这也是最简单、最典型的一种滑动冲突,因为它的滑动比较简单,不管多复杂的滑动冲突,它们之间的区别仅仅是滑动规则不同而已。抛开规则不说,我们需要找到一种不依赖具体的滑动规则的通用的解决方法,在这里,我们就根据场景1的情况来得出通用的解决方法,然后场景2和场景3我们只需要修改有关滑动规则的逻辑即可。之前说过,针对场景1中的滑动,我们可以根据滑动的距离差来判断,这个距离差就是所谓的滑动规则。如果用ViewPager去实现场景1中的效果,我们不需要手动处理滑动冲突,因为ViewP.原创 2020-08-17 09:48:45 · 313 阅读 · 0 评论 -
View的滑动冲突---滑动冲突的处理规则
对于场景1,它的处理规则是,当用户左右滑动时,需要让外部的View拦截点击事件,当用户上下滑动时,需要让内部View拦截点击事件。这个时候我们就可以根据它们的特征来解决冲突,具体来说是,根据滑动是水平滑动还是竖直滑动来判断到底由谁来拦截事件,如下图所示:根据滑动中两个点之间的坐标就可以得出到底是水平滑动还是竖直滑动。如何根据坐标来得到滑动的方向呢?这个很简单,由很多可以参考,比如可以根据滑动路径和水平方向所形成的夹角,也可以依据水平方向和竖直方向上的距离差来判断,某些特殊时候还可以依据水平和竖直方向的.原创 2020-08-03 15:42:08 · 202 阅读 · 0 评论 -
View的滑动冲突---常见的滑动冲突场景
常见的滑动冲突场景可以简单分为如下三种:场景1 - 外部滑动方向和内部滑动方向不一致场景2 - 外部滑动方向和内部滑动方向一致场景3 - 上面两张情况的嵌套先说场景1,主要是将ViewPager和Fragment配合使用所组成的页面滑动效果,主流应用几乎都会使用这个效果。在这种效果中,可以通过左右滑动来切换页面,而每个页面内部往往又是一个ListView。本来这种情况下是有滑动冲突的,但ViewPager内部处理了这种滑动冲突,因此使用ViewPager时我们无须关注这个问题,如果我们采取的不是V原创 2020-08-02 13:38:46 · 208 阅读 · 0 评论 -
View的事件分发机制---事件分发机制的源码分析
1.Activity对点击事件的分发过程点击事件用MotionEvent来表示,当一个点击操作发生时,事件最先传递给当前Activity,由Activity的dispatchTouchEvent来进行事件派发,具体的工作是由Activity内部的Window来完成的。Window会将事件传递给decor view,decor view一般就是当前界面的底层容器(即setContentView所设置的View的父容器),通过Activity.getWindow.getDecorView()可以获得。我们先原创 2020-07-31 15:29:00 · 91 阅读 · 0 评论 -
View的事件分发机制---点击事件的传递机制
在介绍点击事件的传递机制之前,首先我们要明白这里要分析的对象就是MotionEvent,即点击事件,所谓点击事件的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程,点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent onInterceptTouchEvent 和 onTouchEvent,下面我们先介绍这几个方法: **public boo原创 2020-07-28 15:38:13 · 218 阅读 · 0 评论 -
弹性滑动---使用延时策略
延时策略的核心思想是通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的postDelayed方法,也可以使用线程的sleep方法,对于postDelayed方法来说,我们可以通过它来延时发送一个消息,然后在消息中来进行View的滑动,如果接连不断地发送这种延时消息,那么就可以实现弹性滑动的效果,对于sleep方法来说,通过在while循环中不断地滑动View和Sleep,就可以实现弹性滑动的效果。 下面采用Handler来做个示例,其他方法请你自行去尝试,思想都是类原创 2020-07-28 11:01:48 · 104 阅读 · 0 评论 -
弹性滑动---通过动画
动画本身就是一种渐进的过程,因此通过它来实现的滑动天然具有弹性效果,比如以下代码可以让一个View的内容在100ms内向左移动100像素ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();不过这里想说的不是这个问题,我们可以利用动画的特性来实现一些动画不能实现的效果。还拿scroll来说,我们也想模仿Scroller来实现View的弹性滑动,那么利用动画的特性,我们可以采用如下方式来实现fi原创 2020-07-28 10:43:36 · 171 阅读 · 0 评论 -
弹性滑动---使用Scroller
Scroller scroller = new Scroller(mContext);//缓慢滚动到指定位置private void smoothScrollTo(int destX,int destY){ int scrollX = getScrollX(); int deltaX = destX - scrollX; //1000ms内滑向destX,效果就是慢慢滑动 mScroller.startScroll(scrollX,0,destX,0,1000);原创 2020-07-28 10:13:34 · 279 阅读 · 0 评论 -
View的滑动---改变布局参数
第三种实现View滑动的方法,就是改变布局参数,即改变LayoutParams。这个比较好理解了,比如我们想把一个Button向右平移100px,我们只需要将这个Button的LayoutParams里的marginLeft参数的值增加到100px即可,是不是很简单呢?还有一种情形,为了达到移动Button的目的,我们可以再Button左边放置一个空的View,这个空View的默认宽度为0,当我们需要向右移动Button时,只需要重新设置空View的宽度即可,当空View的宽度增大时(假设Button的父容原创 2020-07-27 20:00:22 · 255 阅读 · 0 评论 -
View的滑动---使用动画
使用动画来移动View,主要是操作View的translationX和translationY属性,即可采用传统的View动画,也可以采用属性动画。采用View动画的代码,如下所示。次动画可以再100ms内将一个View从原始位置向右下角移动100个像素<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"android:fillAft原创 2020-07-27 08:25:53 · 204 阅读 · 0 评论 -
View的滑动---使用scrollTo/scrollBy
1. 使用scrollTo/scrollBy为了实现View的滑动,View提供了专门的方法来实现这个功能,那就是scrollTo和scrollBy,先看看这两个方法的实现:public void scrollTo(int x,int y){ if(mScrollX != x || mScrollY != y){ int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScr原创 2020-07-24 15:42:15 · 307 阅读 · 0 评论 -
View基础知识---VelocityTracker、GestureDetector和Scroller
1.VelocityTracker速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。它的使用过程很简单,首先,在View的onTouchEvent方法中追踪当前单击事件的速度VelocityTracker velocityTracker = VelocityTracker .obtain();velocityTracker.addMovement(event);接着,当我们知道当前的滑动速度时,这个时候可以采用如下方式来获得当前的速度velocityTracker.comput原创 2020-07-24 15:18:52 · 196 阅读 · 0 评论 -
Android-----Gson学习
一、什么是Gson?Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。 它还可以用于将JSON字符串转换为等效的Java对象。 Gson可以处理任意Java对象,包括您没有源代码的现有对象。有一些开源项目可以将Java对象转换为JSON。 但是,大多数方法都要求您在类中放置Java批注。 如果您无法访问源代码,则无法执行某些操作。 大多数还不完全支持Java泛型的使用。 Gson认为这两个都是非常重要的设计目标。二、为什么要使用Gson?提供简单的toJson()和fromJs原创 2020-07-24 10:43:35 · 138 阅读 · 0 评论 -
View基础知识---MotionEvent和TouchSlop
1.MotionEvent在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种ACTION_DOWN——手指刚接触屏幕ACTION_MOVE——手指在屏幕上移动ACTION_UP——手指从屏幕上松开的一瞬间正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,考虑如下几种情况:点击屏幕后离开松开,事件序列为DOWN -> UP;点击屏幕滑动一会再松开,事件序列为DOWN -> MOVE -> … ->MOVE ->UP上述三种情况是典型的事件序列,原创 2020-07-23 08:16:36 · 292 阅读 · 0 评论 -
View的基础知识---View的位置参数
View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom,其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标,View的坐标和父容器的关系如图:很容易得出View的宽高和坐标的关系width = right - leftheight = bottom - top如何得到View的这四个属性呢?在View的源码中它们对应于mLeft、mRigh、mTop和mBottom这四个成员变量,获取方原创 2020-07-22 19:15:19 · 671 阅读 · 0 评论 -
3.Android中的IPC方式---使用AIDL(2)
我们接着再调用一下另外一个接口addBook,我们在客户端给服务器添加一本书,然后再获取一次,看程序是否能够正常工作。还是上次的代码,客户端在服务连接后,在onServiceConnected中做如下改动public void onServiceConnected(ComponentName name, IBinder service) { IBookManager bookManager = IBookManager.Stub.asInterface(service);原创 2020-06-10 22:02:25 · 111 阅读 · 0 评论 -
3.Android中的IPC方式---使用AIDL(1)
Messenger是以串行的方式来处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端任然只能一个个处理,如果有大量的并发请求,那么用Messenger就太不合适了。同时,Messenger的作用主要是为了传递消息,很多时候我们可能需要跨进程调用服务端的方法,这种情形用Messenger就无法做到了,但是我们可以使用AIDL来实现跨进程的方法调用。AIDL也是Messenger的底层实现,因此Messenger本质上也是AIDL,只不过系统为我们做了封装从而方便上层的调用,在Binder的基础上可以原创 2020-06-08 21:16:13 · 119 阅读 · 0 评论 -
3.Android中的IPC方式---使用Messenger
Messenger可以翻译为信使,顾名思义,通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以轻松地实现数据的进程间传递了。Messenger是一种轻量级的IPC方案,它的底层是AIDL。下面是Messenger的两个构造方法,从构造方法的实现上我们可以明显看出AIDL的痕迹,不管是IMessenger还是Stub.asInterface,这种使用方法都表明它的底层是AIDL。public Messenger(Handler target){ mTarg原创 2020-06-07 16:26:35 · 144 阅读 · 0 评论 -
3.Android中的IPC方式---使用文件共享
共享文件也是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取这个文件来获取数据。我们知道,在Windows上,一个文件如果被加了排斥锁将会导致其他线程无法对其进行访问,包括读和写,由于Android系统基于Linux,使得其并发读/写可以没有限制地进行,甚至两个线程同时对同一个文件进行写操作都是允许的。通过文件交换数据很好使用,除了可以交换一些文本信息外,我们还可以序列化一个对象到文件系统中的同时从另一个进程中恢复这个对象,下面就展示这种使用方法。原创 2020-06-06 20:22:19 · 151 阅读 · 0 评论 -
3.Android中的IPC方式---使用Bundle
我们知道,四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的。由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。基于这一点,当我们在一个进程中启动了另一个进程的Activity、Service、Receiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。当然,我们传输的数据必须能够被序列化,,比如基本类型、实现了Parcellable接口的对象、实现了Seria原创 2020-06-05 18:00:48 · 97 阅读 · 0 评论 -
2.IPC基础概念---Binder
直观来说,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式Binder还可以理解为一种虚拟的物理设备,它的驱动是/dev/binder,该通信方式在Linux中没有;从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowsManager,等等)和相应ManagerService的桥梁;从Android应用层来说,B原创 2020-06-04 17:16:17 · 140 阅读 · 0 评论 -
2.IPC基础概念---Parcelable接口
Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。下面的示例是一个典型的用法:public class User implements Parcelable{ public int userId; public String userName; public boolean isMale; public Book book; public User(int userId,String userN原创 2020-06-02 15:42:02 · 166 阅读 · 0 评论 -
2.IPC基础概念------Serializable接口
IPC基础概念主要包含三方面内容:Serializable接口、Parcelable接口以及Binder,Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时需要使用Serializable或者Parcelable。还有我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,也需要Serializable来完成对象的持久化,下面先介绍如何使用Serializable来完成对象的序列化。2.1 Serializable接口Se原创 2020-05-31 11:46:48 · 292 阅读 · 0 评论