View的工作原理
ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。 View的绘制流程从ViewRoot的performTraversals开始,经过measure、layout和draw三个过程才可以把一个View绘制出来,其中measure用来测量View的宽高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制到屏幕上。 performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶级View的measure、layout和draw这三大流程。其中performMeasure中会调用measure方法,在m...
算法专题
双指针 定义:双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。最常见的双指针算法有两种:一种是,在一个序列里边,用两个指针维护一段区间;另一种是,在两个序列里边,一个指针指向其中一个序列,另外一个指针指向另外一个序列,来维护某种次序。 模版: 1234567891011for (int i = 0, j = 0; i < n; i ++ ) // j从某一位置开始,不一定是0{ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}//常见问题分类:// (1) 对于一个序列,用两个指针维护一段区间,比如快排的划分过程// (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 **核心思想:*优化,将时间复杂度为O(nn)优化为O(n) **思路:**在利用双指针算法解题时,考虑原问题如何用暴力算法解出,观察是否可构成单调性,若可以,就...
View的事件体系
View的基础知识View的定义View是Android中所有控件的基类,View是一种界面层的控件的一种抽象,它代表了一个控件。除了View还有ViewGroup,可以理解成控件组,ViewGroup也继承自View,所以View可以是单个控件也可以是多个控件组成的控件组,通过这种关系就形成了View树的结构 View的位置参数 View的位置主要由四个顶点决定:top(左上角纵坐标),bottom(右下角纵坐标),right(右下角横坐标),left(左上角横坐标) 获取四个参数的方法: 1234mLeft=getLeft();mRight=getRight();mTop=getTop();mBottom=getBottom(); Android3.0之后新引入的参数:x和y(View左上角的坐标),translationX和translationY(View左上角相对于父容器的偏移量,默认值为0),这几个参数也都是相对于父容器的坐标,这几个参数的换算关系如下: 12x=left+translationXy=top+translationY View发生平移时top...
将全景图应用到项目的方法
准备工作 自己准备的全景图 pannellum.js文件 pannellum.css文件 正式步骤 将准备的三个文件移动到assets文件夹下 在assets文件夹下创建index.html 1234567891011121314151617181920212223242526272829303132333435363738394041<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Panorama</title> <link rel="stylesheet" href="pannellum.css"/> <script ty...
Binder连接池
先创建不同需求的AIDL接口 12345678910interface ICompute {//计算加法的功能 int add(int a,int b);}interface ISecurityCenter {//加密 String encrypt(String content); //解密 String decrypt(String password);} 对创建的接口进行实现 123456789101112131415161718192021222324public class ComputeImpl extends ICompute.Stub{ @Override public int add(int a, int b) throws RemoteException { return a+b; }}public class SecurityCenterImpl extends ISecurityCenter.Stub{ ...
Android中的IPC方式
Bundle典型应用场景 当我们在一个进程中启动了另一进程的Activity,Service和Receiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。当然这个数据必须能够被序列化,比如基本数据类型,实现了Parcelable接口的对象,实现了Serializable接口的对象以及一些Android支持的特殊对象。 特殊使用场景 比如A进程正在进行一个计算,计算完成后它要启动B进程的一个组件并把计算结果传递给B进程,可是遗憾的是此结果不支持放入Bundle中。这个时候可以使用如下方法: 通过Intent启动进程B的一个Service组件(比如IntentService),让Service在后台进行计算,计算完毕后再启动B进程中的目标组件,由于Service也在B进程中,所以目标组件可以直接获得计算结果。 使用文件共享概括:两个进程通过读写同一个文件来交换数据 过程: 将数据序列化到文件中 123456789101112131415161718192021222324private void persistToFile(){...
IPC基础概念
Serializable接口Serializable接口的实现 123456public class User implements Serializable { private static final long serialVersionUID=519067123721295773L;//辅助序列化和反序列化过程 public int userId; public String userName; public boolean isMale; } 序列化和反序列化的实现 123456789101112//序列化过程User user=new User(0,"jack",true);// 1. 创建一个User对象ObjectOutputStream out=new ObjectOutputStream(// 2. 创建一个对象输出流 new FileOutputStream("cache.txt")//它包裹了一个文件输入流,指向 "cache.txt");out....
Android多进程模式
开启多线程模式、开启的方法 在Android中使用多进程只有一种方法,那就是给四大组件指定android:process属性 还有一种非常规的方法是通过JNI在native层去fork一个新的进程,但一般不做考虑 实例 12345678910111213141516171819<activity android:name=".ThirdActivity" android:exported="false" android:process=":app"/> <activity android:name=".SecondActivity" android:configChanges="screenLayout" android:exported="false" android:la...
Activity启动模式
什么是Activity所需要的任务栈?“Activity 所需要的任务栈”这个说法的背后,其实是在讨论一个核心概念:taskAffinity(任务相关性)。 简单来说,“Activity 所需要的任务栈” 就是指 一个 Activity “期望”或“倾向于”在哪个任务栈(Task)中运行。 这个“期望”就是由 taskAffinity 这个属性来定义的。一般情况下任务栈的名字为应用的包名,也可以单独为Activity指定taskAffinity属性值,这个属性不能和包名相同。 指定Activity启动模式方法一 通过AndroidMenifest为Activity指定启动模式 123456<activity android:name=".SecondActivity" android:configChanges="screenLayout" android:launchMode="singleTask" android:labe...









