Activity生命周期详解
Activity是什么?Activity是用户和应用程序交互的界面,用户可以在Activity上进行点击、滚动、触摸等操作。一般来说,一个应用是由多个Activity组成,首次进入的Activity称为主Activity。至于如何判断一个Activity是不是主Activity。本篇文章我们先不讨论。后面会讲到。
Activity的活动状态当我查阅关于Activity的官方文档的时候,我发现,官方文档中谈到Activity有三种状态,运行中、暂停、停止。我觉得少了一个销毁。所以这边我简单介绍一下Activity的四种活动状态。
运行中(running)
此acitvity位于前台,并且用户可以在activity中执行触摸、点击、滚动等操作。
暂停(paused)
activity可见,但并不可以操作,比如,当一个弹窗弹出来的时候。
停止(stopped)
activity不可见,一般来说当用户按了home键之后。如果系统内存不够的时候,并且其他应用需要内存时,系统会回收已经停止的activity。
销毁(destroy)
activity不可见,一般处于这种状态的activ ...
TCP三次握手与四次挥手
引言在开发中,时不时会听到关于HTTP的三次握手和四次挥手,在面试中也会被问道HTTP的三次握手和四次挥手,很多开发者可能都会有这这种误解,认为三次握手和四次挥手都是HTTP协议的,实际上,这是错误的。正确的来说,三次挥手与四次握手是在TCP中进行的。
TCP中的三次握手首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。通过下面的图片,我们来详细分析下TCP三次握手
(1)最初两端的TCP进程都处于CLOSED关闭状态,A(Client)主动打开连接,而B(Server)被动打开连接。(A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建立状态ESTABLISHED)
第一次握手:起初两端都处于CLOSED关闭状态,A(Client)将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给B(Server),A(Client)进入SYN- ...
如何理解Window和WindowManager
概述Window表示一个窗口,但在日常开发中我们接触的不多。我们常见的如Toast和PopWindow都是属于Window。Window是一个抽象类,而Window的具体实现类是PhoneWindow。如果我们需要创建一个Window,只需要通过WindowManager去实现。而它的具体实现是在WindowManagerService中。我们需要知道Android所有的视图都是附加在Window上的,换句话说Window是View的直接管理者。
Window与WindowManager在分析Window得工作机制之前,我们先看看如何添加一个Window,具体的我们可以通过WindowManager去添加,实现代码如下:
123456789101112131415TextView text = new TextView(this);text.setText("just a test");WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowMana ...
什么是context?
Context基本概念先看一下Context源码,代码如下:
1234567891011/** * Interface to global information about an application environment. This is * an abstract class whose implementation is provided by * the Android system. It * allows access to application-specific resources and classes, as well as * up-calls for application-level operations such as launching activities, * broadcasting and receiving intents, etc. */public abstract class Context { ...}
解释如下:
有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android ...
Android的线程和线程池
概述线程中Android中是很重要的一个概念。从用途上来说,线程分为主线程和子线程。主线程主要用于界面上的交互,而子线程主要用于一些耗时操作。除了thread之外,在Android中可以扮演线程角色的还有很多。例如Asnyctask、IntentService以及handlerthread。对于asnyctask,它的底层用了线程池,对于intentservice和handlerthread来说,它们的底层则是用了线程。
主线程和子线程主线程数指进程所拥有的线程,在Java 中默认情况下,一个进程只有一个主线程。主线程主要用于处理界面的交互,因为用户随时会和界面发生交互,因此主线程主任何时候都需要有较高的响应速度。否则就会产生界面卡顿。这就要求主线程不能执行耗时任务,所以我们就需要子线程。除了工作线程以外的线程都是子线程。子线程也称工作线程,用于执行一些耗时任务,比如网络请求、I/O操作等。
AsyncTask的工作原理AsyncTask是一个抽象的范型类,它提供了Params、Progress和Result这三个范型参数,其中Params表示参数的类型,Progress表示后台执行的 ...
Android的消息机制
概述说到Android的消息机制,我们肯定会想到Handler。是的,Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。当我们工作的时候我们只要接触到Handler就可以了。
Android的消息机制主要是指handlr的运行机制,handler的运行需要底层的messagequeue和looper来支撑。messagequeue就是消息队列,也就是说它内部存储了一组消息,以队列的形式对外提供插入和删除的工作,虽然叫队列,但其内部是用单链表的数据结构来存储消息列表的。looper意旨循环,在这也就说消息循环。由于messagequeue只是一个消息的存储单元。并不能去处理消息,送一我们就需要looper去填补。looper会以无限循环的形式去遍历messagequeue,如果有消息就取出。否则一直等待着。
提到线程,我们就需要提到threadlocal,threadlocal并不是线程,但它可以在每个线程中存储数据。后面我们会分析threadlocal的源码来解释它是如何在多个线程中存储数据的。
疑问ha ...
Hashmap源码分析
概述hashmap应该是集合中较复杂的一个类。最早出现在1.2中,在1.8中加入了红黑树,所以1.8的改动很大。hashmap允许null值和null键,底层是通过散列算法实现的。并且hashmap不是线程安全的。
源码分析成员变量1234567891011121314151617181920//默认的初始化数组大小为16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4//最大存储容量static final int MAXIMUM_CAPACITY = 1 << 30//默认扩容因子static final float DEFAULT_LOAD_FACTOR = 0.75f;//这是jdk1.8新加的,这是链表的最大长度,当大于这个长度时,就会将链表转成红黑树static final int TREEIFY_THRESHOLD = 8;//table就是存储Node 的数组,就是hash表中的桶位transient Node<K,V>[] table;//实际存储的数量,则HashMap的si ...
TreeMap源码分析
概述TreeMap是红黑树的java实现,红黑树能保证增、删、查等基本操作的时间复杂度为O(lgN)。首先我们来看一张TreeMap的继承体系图:
还是比较直观的,这里来简单说一下继承体系中不常见的接口NavigableMap和SortedMap,这两个接口见名知意。先说NavigableMap接口,NavigableMap接口声明了一些列具有导航功能的方法,比如:
12345678910111213141516/** * 返回红黑树中最小键所对应的 Entry */Map.Entry<K,V> firstEntry();/** * 返回最大的键 maxKey,且 maxKey 仅小于参数 key */K lowerKey(K key);/** * 返回最小的键 minKey,且 minKey 仅大于参数 key */K higherKey(K key);// 其他略
通过这些导航方法,我们可以快速定位到目标的 key 或 Entry。至于 SortedMap 接口,这个接口提供了一些基于有序键的操作,比如:
1234567891011/** * 返回包含键值在 [ ...
LinkedList源码分析
概述LinkedList弥补了ArrayList增删较慢的问题,但在查找方面又逊色于ArrayList,所以在使用时需要根据场景灵活选择。对于这两个频繁使用的集合类,掌握它们的源码并正确使用,可以让我们的代码更高效。
LinkedList 是一个继承于AbstractSequentialList的双向循环链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。
LinkedList的基本属性LinkedList的成员变量只有三个,所以很简单。
12345678// 记录当前链表的长度transient int size = 0;// 第一个节点transient Node< ...
ArrayList源码分析
概述ArrayList是日常开发中使用最频繁的集合类。首先这边简单介绍一下ArrayList:
ArrayList是通过动态数组去实现的
ArrayList并不是线程安全的
实现了RandomAccess接口,可以通过下标序号进行快速访问
实现了Cloneable接口,能被克隆
实现了Serializable接口,支持序列化
ArrayList基本的属性ArrayList属性主要就是当前数组长度size,以及存放数组的对象elementData数组,除此之外还有一个经常用到的属性就是从AbstractList继承过来的modCount属性,代表ArrayList集合的修改次数。
123456789101112131415161718public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable { // 序列化id private static final long serial ...