知识

Java

Java三大特性详解

指的是封装,继承,多态
封装:指的是属性私有化,根据需要提供setter和getter方法来访问属性。即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。
目的:增强安全性和简化编程

继承:是指将多个相同的属性和方法提取出来,新建一个父类用来继承。目的:代码复用。

多态可以分为两种:设计时多态和运行时多态。
设计时多态:即重载(Overload),是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
运行时多态:即重写(Override),是指Java运行根据调用该方法的类型决定调用哪个方法。
目的:增加代码的灵活度。

String,StringBuffer,StringBuilder的区别

StringBuffer:线程安全
StringBuilder:线程不安全。
当多个线程同步操作数据,使用StringBuffer
因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有修饰。

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

StringBuilder执行效率高于StringBuffer,更快,但是不安全
当字符赋值少使用String
字符赋值频繁使用StringBuilder
多个线程同步操作数据,使用StringBuffer

Java中==,equal和hashCode的区别

首先equals和==最大的区别是一个是方法一个是运算符,==比较的是地址,equals比较的是值
== :该操作符生成的是一个boolean结果,比较的是对象的地址
equals方法本意是用来判断引用的对象是否一致,比较的是对象的内容或者值
hashcode是系统用来快速检索对象而使用
hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。
重写equals方法,必须也要重写hashCode方法
两个对象 equals 相等,那他们 hashCode 一定也相等
两个对象 hashCode 相等,那他们 equals 不一定相等
hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率高

String 属于基础的数据类型吗?

    String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
static和final的意义是不同的,
static修饰的时候代表对象是静态的,而final修饰的时候代表对象只能赋值一次,
他们连用的时候是因为定义的那个对象既要它是静态的,也要求它的值不能再被修改。
当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。

接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
抽象类是对类抽象,而接口是对行为的抽象。
与抽象类相比,接口性能较慢。
JAVA8 增加,在接口中被default标记的方法为普通方法,可以直接写方法体。
java接口可以被继承,而且是多继承,但是只能是接口继承接口,类只能实现接口。
一个接口可以继承另一个接口或多个,一个普通类可以实现多个接口,抽象类也可以实现多个接口
接口不可实现接口,只能继承接口
如果一个类里有抽象方法,那么这个类只能是抽象类

Java线程和多线程和线程池

Java创建线程主要有三种方式,分别为:继承Thread类创建线程类;通过Runnable接口创建线程类;通过Callable和Future创建线程和使用线程池。
Java线程共有5中状态,分别为:新建(new)、就绪(runnable)、运行(running)、堵塞(blocked)、死亡(dead)
同步的实现方面有两种,分别是synchronized,wait与notify
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
volatile不能保证线程安全而synchronized可以保证线程安全。
线程是进程的子集,一个进程可以有很多线程。一个程序至少一个进程,一个进程至少一个线程。
Java线程池有四种,分别为:newSingleThreadExecutor、newCachedThreadPool、newFixedThreadPool、newScheduleThreadPool。
线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。

java多线程中sleep和wait的4个区别

1、sleep是线程中的方法,但是wait是Object中的方法。
62、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)

ThreadLocal是什么

ThreadLocal是线程本地变量的意思,主要用于多线程对同一个变量的读写操作,在多线程环境下去保证变量的安全。
执行remove避免内存泄漏, ThreadLocal 内部维护了一个 Map,Key为弱引用

final finally finalize三个关键字的区别

final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代
码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来
调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize(),回收垃圾。 

Java类加载机制

类的生命周期
包括以下 7 个阶段:
加载(Loading)
验证(Verification)
准备(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸载(Unloading)

浅谈String s1 = "abc" 和s2= new String("abc")的区别

s1==s2->false
s1.equals(s2)->true
String temp = "hello";  // 在常量池中
String str = new String(temp); // 在堆上     这段代码就创建了2个String对象
String str = "test";以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象
以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象,
若不存在则会在实例池中创建"test"对象,同时在堆中创建"test"这个对象

Java:强引用,软引用,弱引用和虚引用

StrongReference,SoftReference,WeakReference,PhantomReference
java默认就是强引用
目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。
可以避免OOM内存溢出,在安卓主要是处理缓存用的多,我们可以在确定一个 Bitmap 被回收后,再去申请另外一个 Bitmap 的内存

jvm垃圾回收机制

JVM 的主要组成部分 类加载器,栈内存,堆内存,方法区,程序计数器,运行数据区
原理:引用计数法以及可达性分析算法(标记清除,标记整理,复制算法,分代算法等等)
需要进行回收垃圾的区:堆和方法区
垃圾回收有两种类型:Minor GC 和 Full GC

说一下堆栈的区别?

功能方面:堆是用来存放对象的,栈是用来执行程序的。
共享性:堆是线程共享的,栈是线程私有的。
空间大小:堆大小远远大于栈。

集合相关 map list set

image

image
List:继承Collection接口;有序集合,允许重复元素
Set: 继承Collection接口;无序集合,不允许重复元素,且最多有一个null值。
Map: key_value键值对;不允许重复元素。

常用的Map集合:HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。


HashMap和Hashtable的区别
HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的
HashMap允许K/V都为null,后者都不允许为null

ArrayList和Vector的区别
这两个类都实现了List接口,都是有序的集合,相当于动态数组,可以按照位置索引取出元素,数据也是允许重复的
区别主要包括两方面:同步性和数据增长
Vector是线程安全的,也就是说他的方法之间是线程同步的,加了synchronized关键字,ArrayList则相反
如果是单线程可以选择ArrayList,多线程则可以选择Vector
Vector在数据满时,增长为原来的2倍,而ArrayList在数据达到容量一半时,增长为原容量的0.5倍 + 1个空间

ArrayList和LinkedList的区别
LinkedList实现了List和Deque接口,一般称为双向链表,ArrayList实现了List接口,动态数组
LinkedList在插入和删除数据时效率更高,ArrayList在查找,某个index的数据时效率更高
LinkedList比ArrayList需要更多的内存

JAVA反射与注解

反射和注解,并实现的依赖注入
反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单来说反射可以实现在运行时可以知道任意一个类的属性和方法。
反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理(ps:这个知识点也很重要,后续会为大家讲到)

Java 反射机制的应用场景

逆向代码 ,例如反编译
与注解相结合的框架 例如Retrofit
单纯的反射机制应用框架 例如EventBus
动态生成类框架 例如Gson

基本写法

Class c = Man.class;
Object o = c.newInstance();
Method eat = c.getMethod("eat", String.class);
eat.invoke(o,"小明");

Field name = c.getField("name");
name.get(o);

Java中集合的泛型,是防止错误输入的,只在编译阶段有效,可以通过反射在泛型为String类型的List里面添加Int类型

注解

什么是注解:

注解也叫元数据,是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。

注解分为三种:

一类是Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings
分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。

一类为元注解,元注解是用于定义注解的注解
@Target
@Retention
@Documented
@Inherited

@Target用于标明注解使用的范围
@Retention用于标明注解被保留的阶段
@Documented用于标明是否生成javadoc文档。
@Inherited用于标明注解可继承


一类为自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

一般用法
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
    /**
     * id
     * @return
     */
    public int id() default -1;
    /**
     * name
     * @return
     */
    public String name() default "";
}

注解处理器。原理就是反射机制。想使用反射去读取注解,必须将 Retention的值选为RUNTIME
Class c = Man.class;
Object o = c.newInstance();
Field field = c.getDeclaredField("name");
ManName annotation = field.getAnnotation(ManName.class);
System.out.println(annotation.name());
image

泛型

泛型的主要目标是提高 Java 程序的类型安全
泛型就是参数化类型,就是一种类型约束,通配符
泛型是通过类型擦除来实现的,泛型只在编译阶段有效
泛型分为:泛型类,泛型接口,泛型方法

泛型中通配符

常用的 T,E,K,V,?

?无界通配符 看成所有类型的父类,当具体类型不确定,泛型类不能用无界通配符

上界通配符 < ? extends E> 表示该参数必须继承XXX

下界通配符 < ? super E>  表示给参数为XXX的父对象

?和 T 的区别

T和?运用的地方有点不同,?是定义在引用变量上,T是类上或方法上(当变量指向一个对象时,这个变量就被称为引用变量)

泛型类,泛型接口,泛型方法

泛型方法的声明必须要在public <T> void fangfa(T t);其中<T> 表示声明这个方法为泛型方法
有泛型方法的类不一定是泛型类,注意泛型方法里的T可以和当前泛型类的T不一样,是一种新的类型

Java泛型实现原理:类型擦出

Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信的。
使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。  

设计模式

Android常用设计模式:

单例模式;
    例:Gson,Utils,EventBus,工具类
    饿汉,懒汉,懒汉双重加锁,静态内部类(懒加载,线程安全)
Build模式(建造者模式);
    例:AlertDialog,Glide,Picasso,Retrofit,链式调用
    变种Builder模式和普通写法,变种就是静态内部类,链式调用
    隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
观察者模式;
    例:广播、EventBus、RxJava,Listener,RecyclerView中的ui更新(notifyDataSetChanged)
    定义一个被观察者和多个观察者,每当被观察者变化,所有观察者都会得到通知。
    核心:用一个list把观察者保存起来,并提供add和remove观察者,在被观察者变化的时候就遍历并调用list里观察者的方法。核心就是一个list遍历
    一般是通过接口回调的方式通知观察者(小明取快递)
适配器模式;
    例:FragMentAdapter,RecycleAdapter,ListAdapter
    适配器模式有三种:类适配器(继承),对象适配器(持有引用),接口适配器(实现两个接口).
    适配方式有两种:继承和构造传递(持有引用),成龙翻译
    通过适配器连接不同的接口,适配器模式把一个类的接口变换成另一种适配接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够在一起工作。
代理模式;
    分为静态代理和动态代理
    静态代理主要是通过构造对象(持有引用) 动态代理则是通过反射实现的
    动态代理实现的是JDK提供的接口InvocationHandler调用invoke方法实现
工厂模式;
    例:FragmentFactory,第三方登录
    工厂模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    工厂模式分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。
    工厂方法模式主要用来创建复杂的对象,简单对象能够使用new来创建就不用工厂方法模式来创建了。
原型模式;
策略模式;
装饰者模式;
组合模式;
迭代器模式。

设计模式的六大原则 :开闭原则,接口隔离原则,合成复用原则,依赖倒转原则,里氏替换原则,最少知道原则
java面向对象的五大原则:单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口隔离原则

Android

Handler的原理

Handler,Message,looper 和 MessageQueue 构成了安卓的消息机制,
    1.handler创建后可以通过 sendMessage 将消息加入消息队列
    2.然后 looper不断的将消息从 MessageQueue(单链表) 中取出来
    3.回调到 Hander 的 handleMessage方法,从而实现线程的通信。

如何在子线程创建handler
    1.Looper.prepare(); Handler handler = new Handler(); Looper.loop();
    2.子线程中Handler handler = new Handler(Looper.getMainLooper());,此时两者就不在一个线程中。

        1)Looper:  一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue( 消息队列 ) 和对消息进行循环。 
        
        2)Handler:  你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 从 Message Queue 取出 所送来的消息。 
        
        3) Message Queue( 消息队列 ): 用来存放线程放入的消息。 
        
        4) Message:是线程间通讯的消息载体。两个码头之间运输货物,Message充当集装箱的功能,里面可以存放任何你想传递的消息。


为什么主线程Looper不会阻塞
    因为创建了新的binder线程
主线程Looper创建在哪里
Activity的启动一般会调用到ActivityThread,里面有main方法,是初始化activity必经阶段,我们的Looper,就是在main的过程创建的。
内存泄漏解决方案
写静态内部类,并且用弱引用

进程之间的通信IPC

1.Bundle (四大组件间)通过intent传入Bundle
2.文件共享 序列化Serialzable与Parcelable
3.AIDL (基于Binder) 
4.Messenger(基于Binder) 
5.ContentProvider(基于Binder) 
6.Socket(网络) 

安卓多线程的方式

    AsyncTask
    HandlerThread:封装了Handler + Thread。
    IntentService
通信方式
    1.runOnUiThread(Runnable) 
    2.使用Handler
    3.使用AsyncTask

LeakCanary

内存泄漏
传统意义上的内存泄漏是至忘记手动释放内存,导致未释放的内存不可使用的现象。
严格说:只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。
jvm 的内存泄漏
jvm的内存泄漏指的是我们本不再需要的内存,躲过了垃圾回收的现象。
android中的内存泄漏指的是 短生命周期的对象被长生命周期的对象所持有,导致无法进行垃圾回收的现象。

当一个Activity(Object)被回收时,会执行 finalize()。可以通过finalize()是否执行判断Activity是否被回收。
内存泄漏举例
单例的生命周期和应用程序是一样长的,单例的静态特性使得其生命周期和应用的生命周期一样长,如果一个
对象已经不再需要使用了,而单例对象还持有该对象的引用,就会使得该对象不能被正常回收,从而导致了内存泄漏。
一些提供close的资源未关闭导致内存泄漏 数据库连接( dataSourse. getConnection()),网络连接
(socket)和io连接必须手动close,否则是不能被回收的。

性能优化

布局优化:<include>复用,<viewStub>延迟加载,<merge>减少层级
网络优化:重连,离线缓存,Network Monitor检测
内存优化:LeakCanary,Handler,单例模式,EventBus,bitmap,buttenkinf,资源对象close()、destroy()、recycler()、release();软引用
启动优化:Application的onCreate(特别是第三方SDK初始化),可以放到子线程或者IntentService中
UI优化:动画优化,过度绘制,开发者模式工具
图片优化:压缩,等比例,采样率,RGB,Bitmap
APK瘦身:图片资源压缩,资源文件混淆,去除SO文件ARMv7/ARMv8,资源网络动态加载,移除无用资源。

屏幕适配

原因:android碎片化严重,

“布局”匹配
    使用相对布局(RelativeLayout),禁用绝对布局(AbsoluteLayout)
    还可以用约束布局
    通过限定符(不同分辨率的Layout文件夹)使得程序在运行时根据当前设备的配置(屏幕尺寸)自动加载合适的布局资源
“布局组件”匹配
    不使用px,尽量用dp
    多套 dimens 适配,建立多个不同分辨率的 values 文件夹
    多使用带权重的属性
“图片资源”匹配
    点9的使用
    xhdpi应该是首选,只需选择唯一一套分辨率规格的图片资源

主流适配

1.宽高限定符适配
    宽高限定符适配也可以叫屏幕分辨率适配,需要在res文件下创建各种针对不同屏幕分辨率对应的values文件夹。
2.SmallestWidth适配 -主流
    SmallestWidth适配可以称为最小宽度适配。不管屏幕是横屏还是竖屏,都会以最小的那一边作为宽度进行适配。
3.今日头条适配方案 -主流
    原理:动态修改手机的像素密度(density)
    AndroidAutoSize

Bitmap二次采样,LruCache缓存管理

二次采样:BitmapFactory.Options()加载大小,获取宽高,定义缩放比例,加载图片;
LruCache的核心思想很好理解,就是要维护一个缓存对象列表(LinkedHashMap),其中对象列表排列方式是按照访问顺序实现的,
即一直没访问的对象,将放在队尾,即将被淘汰
三级缓存分别是内存LruCache和本地DiskLruCache和网络

Android五种储存方式

文件存储
SharedPreferences
SQLite数据库存储
ContentProvider
网络存储

自定义VIew

自定义View三种方式,组合现有控件,继承现有控件,继承View
重写方法:onMeasure妹奢、 onLayout、onDraw、onTouchEvent  (ViewGroup才onLayout)
测量模式MeasureSpec:exactly,at_most,unspecified

步骤
1.在res/values/下建立一个attrs.xml,用来自定义View的属性
2.构造函数,getTheme().obtainStyledAttributes(a ture biu te)获取属性
3.重写onMesure时,需要知道MeasureSpec的三种类型:
4.重写onDraw函数,根据读取到的自定义属性,绘制出相应的控件:canvas Paint
Android view的刷新:
    //只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制
    invalidate(); 
     //只会触发执行onDraw方法,但是可以在子线程中刷新
    postInvalidate();   
     //view的布局参数改变之后刷新,比如view的宽度和高度都修改了,只能通过requestLayout()方法刷新
    requestLayout();

事件分发机制

1.传递的顺序:Activity -> ViewGroup -> View
    (Activity——>PhoneWindow——>DecorView——>ViewGroup——>View)
2.经过的方法dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()
3.事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件,如下图:
4.如果事件不被中断,整个事件流向是一个类U型图,传递分发是往下走,消费响应是往上走的
getParent().requestDisallowInterceptTouchEvent(true);组织上层拦截

java和js交互四种方式

安卓调用js

webView.loadUrl();
webView.evaluateJavascript()

js调用安卓

webView.addJavascriptInterface()
WebViewClient.shouldOverrideUrlLoading()

断点续传

setRequestProperty() Range
RandomAccessFile()的Seek()写入

Glide

glide最大的优势就是对bitmap的管理是跟随生命周期去发生改变的,glide的优势就是当Activity销毁的时候,之前加载的所有图片的内存都释放了。
glide如何监听到Activity的生命周期
glide是通过新建一个空的Fragment去监听Activity的生命周期。
Fragment和Actvity关联上了,这样就可以通过Fragment得知当前Activty的生命周期。
缓存
diskCacheStrategy()方法更改缓存策略
Glide 缓存机制主要分为2种:内存缓存和磁盘缓存
使用内存缓存的原因是:防止应用重复将图片读入到内存,造成内存资源浪费。
使用磁盘缓存的原因是:防止应用重复从网络或其它地方下载和读取数据。
其中内存缓存是由弱引用+LruCache组成。磁盘缓存就是通过DiskLruCache
LruCache的核心思想很好理解,就是要维护一个缓存对象列表(LinkedHashMap),根据Lru算法来管理图片。大致的原理是利用linkHashMap链表的特性,把最近使用过的文件插入到列表头部,没使用的图片放在尾部;
读取数据的顺序是:弱引用 > LruCache > DiskLruCache>网络;
写入缓存的顺序是:网络 --> DiskLruCache--> LruCache-->弱引用

Okhttp

OKhttp用了哪些设计模式
    责任链模式,建造者,观察者,工厂模式,单例模式
Okhttp的核心类有哪些?简单讲一下
    Dispatcher类:调度
    Interceptor类(in te san pu che):拦截
OkHttp的优势
    1.易使用、易扩展。
    2.支持缓存处理,可以避免重复请求。
    3.OkHttp 还处理了代理服务器问题和SSL握手失败问题
    4.如果你的服务有多个 IP 地址,当第一次连接失败,OkHttp 会尝试备用地址。
几个拦截器的作用:
    RetryAndFollowUpInterceptor:重试和失败重定向拦截器         
    BridgeInterceptor:桥接拦截器,处理一些必须的请求头信息的拦截器        
    CacheInterceptor:缓存拦截器,用于处理缓存       
    ConnectInterceptor:连接拦截器,建立可用的连接,是CallServerInterceptor的基本      

volley:高并发,同时请求,小数据。HttpURLConnection,封装好
Okhttp:大文件上传下载,拦截器,缓存。封装麻烦,callback回来是在子线程里面
Retrofit:封装好,restFul

Binder

Binder通信机制采用C/S架构,这很重要!!!

MVC MVP MVVM

MVVM模式中,一个ViewModel和一个View匹配,它没有MVP中的IView接口,而是完全的和View绑定

MVC 编程模式
(Model View Controller 模型-视图-控制器)
    MVP
全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
MVVM
MVVM是Model-View-ViewModel的简写。
1.mvvm模式将Presener改名为View Model,基本上与MVP模式完全一致,唯一的区别是,它采用双向绑定(data-binding)
2.它实现了View和Model的自动同步

第三方IM

环信
容联云
融云
极光IM
云通讯IM(腾讯)
云旺IM(阿里)
网易云信
声网 视频直播

dataBinding

mvvm模式
在xml中写(逻辑)代码
消除findViewById (我选择kt)
Jetpack Compose  颠覆性 的 声明式 UI 框架 ,它的口号就是 消灭 xml 文件 !
jetpack-> Lifecycle LiveData ViewModel dataBinding

Service

Activity和Service通信的几种方式
    1.通过Binder对象,在Service里面重写onBind(),通过ta返回我们的Service对象。也可以接口回调
    2.通过broadcast(广播)的形式。
Service 和 IntentService的区别;
    1.首先,IntentService是继承的Service
    2.Service做耗时操作会ANR,因为也是主线程;
    3.IntentService做耗时操作,ta里面的onHandlerIntent()方法走完就会销毁掉自己
StartService和BindServer启动区别
    1.对Service生命周期的影响
    2.启动的Service是独立于开启它的Activity的。Activity退出后,Service仍然在运行中。
    3.启动的Service是与开启它的Activity梆定在一起的。Activity退出时,Service会同时退出。
    扩展:(同时使用)(想要启动一个后台服务长期进行某项任务又要与其保持通讯)

广播相关

原理:
    1.广播是通过Binder机制,结合观察者模式。
    2.Android中我们发送广播内容是一个Intent,这个Intent中可以携带我们要发送的数据。
种类:
    1.有序广播:可以处理,可以停止    
    2.无序广播:不可以处理,不可以停止  
    3.普通广播 
两者及其接收广播的区别:
    1.动态注册广播不是常驻型广播,也就是说广播跟随Activity的生命周期。注意在Activity结束前,移除广播接收器。   
    2.静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
用过吗?
    1.比如系统的网络状态,电量状态,短信收发,
    2.不同App的组件之间的通信
    3.同一App具有多个进程的不同组件之间的消息通信 
    4.可以用EvenBus代替,发布/订阅事件总线机制,代替Intent,Handler,Broadcast

封装Retrofit

Socket和http

OSI七层网络模型分别是:
    物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
socket是什么?
    Socket不是一种协议,而是一个编程调用接口。
socket和http区别
    1.Socket 是对 TCP/IP 协议的封装,长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉
    2.HTTP 协议:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
    TCP/IP是传输层协议,主要解决数据如何在网络中传输;
    HTTP是应用层协议,主要解决如何包装数据。
Tcp和Udp
    1.TCP/IP协议拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。
    2.UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。
TCP的三次握手和四次挥手
    报文
Socket和WebSocket的区别
    1.Socket是应用层与传输层的一个抽象
    2.WebSocket是应用层协议,它是基于TCP实现的,服务端主动向客户端推送数据,双向通讯
 android Get与Post的本质区别 
    1. get是从服务器上获取数据,post是向服务器传送数据。
    2. get是把参数数据是透明的,post是采用post机制把数据和值放到head里面
    3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
    4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,加密,建议用Post方式;

Android加密方式

1.MD5 不可逆
2.AES加密:一种高级区块加密标准。它是一个对称密码,就是说加密和解密用相同的密钥。
3.RSA加密:非对称加密算法,非对称加密算法需要两个密钥:公共密钥和私有密钥。

flutter

dart语言

异常捕获
bitmap图片压缩
rx
dagger
retrofit
mvp
js交互
自定义VIew
事件分发
activity
fragment
版本差异权限,通知
android新版本新特性
AsyncTask
进程之间通讯 binder
mvp
动画的几种实现方式
view滑动的几种方式
startServer和bindServier的区别

kotlin

简洁,lambda
类型推断
空指针
协程
高阶函数

简化空对象的处理(防止空指针)

其他

项目管理工具

jira和禅道

java多线程和android线程
ndk futter
Jetpack
kotlin与java的区别

遇到的技术难点,如何解决的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容