四种启动模式介绍:
2.1、standard启动模式 standard为系统的默认启动模式,系统每启动一个activity都会重新创建一个实例(不管这个实例是否已经存在),并将其加到任务栈中。
2.2、singleTop启动模式 栈顶复用,当要启动的activity位于当前任务栈的栈顶,那么此activity不会重新创建,而是复用这个栈顶activity,并调用它的onNewIntent()方法。当要启动的activity不是栈顶元素时,则按照系统的默认行为进行处理。
2.3、singleTask启动模式 栈内复用,这是一种单实例模式,当任务栈中存在这个activity的实例是,那么系统不会重新创建这个activity,而是调用onNewIntent()方法,同事singleTask启动模式默认具有clearTop的效果,所以当任务栈中存在这个activity,但不是栈顶元素时,那么位于它之上的所有activity都会出栈。
2.4、singleInstance启动模式 单实例模式,这是一种加强的singleTask,它除了具有singleTask的所有特性之外,还加强了一点,那就是这种模式的activity只能单独位于一个任务栈中,所以当后续再次启动这个activity是,会复用之前的任务栈而不会重新创建。
事件分发机制
dispatchTouchEvent()
onTouchEvent()
onInterceptTouchEvent()
Activity 启动过程
Android ListView 与 RecyclerView 对比
Fragment 生命周期
onAttach() :
当Fragment与Activity发生关联时调用。
onCreate():
创建Fragment时被回调。
onCreateView():
每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View 组件。
onActivityCreated():
当 Fragment 所在的Activity被启动完成后回调该方法。
onStart():
启动 Fragment 时被回调,此时Fragment可见。
onResume():
恢复 Fragment 时被回调,获取焦点时回调。
onPause():
暂停 Fragment 时被回调,失去焦点时回调。
onStop():
停止 Fragment 时被回调,Fragment不可见时回调。
onDestroyView():
销毁与Fragment有关的视图,但未与Activity解除绑定。
onDestroy():
销毁 Fragment 时被回调。
onDetach():
与onAttach相对应,当Fragment与Activity关联被取消时调用。
DCL中Volatile的作用 :保证可见性和禁止指令重排序
public class Singleton
{
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
HTTPS加密过程和TLS证书验证
Fragment跟Activity的通信方式
Bundle bundle = new Bundle(); bundle.putString("message", "I love Google"); fragment.setArguments(bundle);
接口回调
Bundle传递数据为什么需要序列化
手写一个快排,分析原理
public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
二分查找
/**
* 使用递归的二分查找
*title:recursionBinarySearch
*@param arr 有序数组
*@param key 待查找关键字
*@return 找到的位置
*/
public static int recursionBinarySearch(int[] arr,int key,int low,int high){
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
int middle = (low + high) / 2; //初始中间位置
if(arr[middle] > key){
//比关键字大则关键字在左区域
return recursionBinarySearch(arr, key, low, middle - 1);
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
return recursionBinarySearch(arr, key, middle + 1, high);
}else {
return middle;
}
}
/**
* 不使用递归的二分查找
*title:commonBinarySearch
*@param arr
*@param key
*@return 关键字位置
*/
public static int commonBinarySearch(int[] arr,int key){
int low = 0;
int high = arr.length - 1;
int middle = 0; //定义middle
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
while(low <= high){
middle = (low + high) / 2;
if(arr[middle] > key){
//比关键字大则关键字在左区域
high = middle - 1;
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
low = middle + 1;
}else{
return middle;
}
}
return -1; //最后仍然没有找到,则返回-1
}
Serializable,Parcelable
多态
事物在运行过程中存在不同的状态
Java实现多态有三个必要条件:继承、重写、向上转型 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
reentrantlock synchronized 区别
两者的共同点:
1)协调多线程对共享对象、变量的访问
2)可重入,同一线程可以多次获得同一个锁
3)都保证了可见性和互斥性
两者的不同点:
1)ReentrantLock显示获得、释放锁,synchronized隐式获得释放锁
2)ReentrantLock可响应中断、可轮回,synchronized是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性
3)ReentrantLock是API级别的,synchronized是JVM级别的
4)ReentrantLock可以实现公平锁
5)ReentrantLock通过Condition可以绑定多个条件
6)底层实现不一样, synchronized是同步阻塞,使用的是悲观并发策略,lock是同步非阻塞,采用的是乐观并发策略
链接:www.jianshu.com/p/650498242…
ConcurrentHashMap是如何实现分段锁
blog.csdn.net/rickiyeat/a… www.jianshu.com/p/9c713de7b… juejin.cn/post/684490…
Java NIO浅析
重写equals()方法就必须重写hashCode()方法的原因
1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
原文链接:blog.csdn.net/u013679744/…
说一下MeasureSpec这个类
http的状态码,常见的请求头
常见的HTTP请求头 请求头 说明 Accept-Charset 用于指定客户端接受的字符集 Accept-Encoding 用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate Accept-Language 用于指定一种自然语言,如Accept-Language:zh-cn Host 用于指定被请求资源的Internet主机和端口号,如Host:www.taobao.com User-Agent 客户端将他的操作系统、浏览器和其他属性告诉服务器 Connection 当前连接是否保持,如Connection:Keep-Alive 常见的HTTP响应头
响应头 说明 Server 使用的服务器名称,如Server:Apache/1.3.6(Unix) Content-Type 用来指明发送给接收者的实体正文的媒体类型,如Content-Type:text/html;charset=GBK Content-Encoding 与请求报头Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码 Content-Language 描述了资源使用的自然语言,与Accept-Language对应 Content-Length 指明实体正文的长度,用以字节方式存储的十进制数字来表示 Keep-Alive 保持连接的时间,如Keep-Alive:timerout=5,max=120 常见的HTTP状态码
200 客户端请求成功 302 临时跳转,跳转的地址通过Location指定 400 客户端请求有语法错误,不能被服务器识别 403 服务器受到请求,但是拒绝提供服务 404 请求的资源不存在 500 服务器发生不可预期的错误
原文链接:blog.csdn.net/en_joker/ar…
LinerLayout跟RelativeLayout的绘制原理
说说你对Context的理解
blog.csdn.net/singwhatiwa… blog.csdn.net/sted_zxz/ar…